如何在模式中重用现有的 HTML 元素?
How to reuse existing HTML element in a modal?
考虑具有自定义组件 <foo>
的 UI- 现在假设它只是文本。
<foo id="foo-id">SOMETEXT</foo>
我想在 UI 上的两个位置显示此内容 - 其中一个在模式中。我怎样才能将模态内容委托给这个现有元素?我正在使用开放 Jquery/angularjs 或本机 HTML 解决方案。
<foo id="foo-id">SOMETEXT</foo>
<div class="modal fade" id="exampleModal" ...>
...
<div class="modal-body">
### REFERENCE TO ID #foo-id here ###
</div>
</div
我试图避免使用该元素的第二个实例,例如:
<foo id="foo-id">SOMETEXT</foo>
<div class="modal fade" id="exampleModal" ...>
...
<div class="modal-body">
<foo id="foo-id-2">SOMETEXT</foo>
</div>
</div
更多上下文
我真正想要这样做的原因是因为我们有一个带有下拉扩展器的网页,它已经呈现了丰富的组件。我们正在尝试添加一个“弹出”按钮,该按钮将以模式 window 显示呈现的元素。因为在按下弹出窗口时元素已经处于正确的加载状态,所以将组件委托给预定义组件而不是重新创建是有意义的。
Stack 是 angularJS, bootstrap 3, jquery 我不能改变这个:(
如果您不需要两个副本,您可以尝试分离该元素并将其插入到他的新位置
let $fooContent = $("#foo-id");
let $myModal = $("#exampleModal > .modal-body");
...
// set it
$myModal.html( $fooContent.detach() );
// back it
$initialFooContentLocation.append( $fooContent.detach() );
我在 vanilla javascript 中的做法是创建一个函数来创建模态元素,然后将其附加到您想要的 DOM 元素,例如body.
一个例子:
function createModal(modalId, fooElement){
const modalDiv = document.createElement('div');
modalDiv.classList.add('modal');
modalDiv.classList.add('fade');
modalDiv.id = modalId;
const modalBodyDiv = document.createElement('div');
modalBodyDiv.classList.add('modal-body');
modalBodyDiv.append(fooElement);
return modalDiv;
}
然后用它来创建 N 个模式元素并将它们附加到任何你想要的地方,例如body,像这样:
const modal1 = createModal('myModal1', fooElement);
document.body.append(modal1)
这样您的 html 会更干净。
注意:这个fooElement
必须是DOM元素,否则会报错。
希望有用!
接受的答案对我有用;但是,为了完整起见,这里还有另一种方法。
使用 $scope/$rootScope
事件发射器在组件之间广播事件。如果组件有明确的 parent/child 关系,通常 $scope
就足够了,如果它们是兄弟姐妹,则它们可以通过 $rootScope
.
共享事件
由于这是一个 angularJS 项目,我关注了 this simple guide.
考虑具有自定义组件 <foo>
的 UI- 现在假设它只是文本。
<foo id="foo-id">SOMETEXT</foo>
我想在 UI 上的两个位置显示此内容 - 其中一个在模式中。我怎样才能将模态内容委托给这个现有元素?我正在使用开放 Jquery/angularjs 或本机 HTML 解决方案。
<foo id="foo-id">SOMETEXT</foo>
<div class="modal fade" id="exampleModal" ...>
...
<div class="modal-body">
### REFERENCE TO ID #foo-id here ###
</div>
</div
我试图避免使用该元素的第二个实例,例如:
<foo id="foo-id">SOMETEXT</foo>
<div class="modal fade" id="exampleModal" ...>
...
<div class="modal-body">
<foo id="foo-id-2">SOMETEXT</foo>
</div>
</div
更多上下文
我真正想要这样做的原因是因为我们有一个带有下拉扩展器的网页,它已经呈现了丰富的组件。我们正在尝试添加一个“弹出”按钮,该按钮将以模式 window 显示呈现的元素。因为在按下弹出窗口时元素已经处于正确的加载状态,所以将组件委托给预定义组件而不是重新创建是有意义的。
Stack 是 angularJS, bootstrap 3, jquery 我不能改变这个:(
如果您不需要两个副本,您可以尝试分离该元素并将其插入到他的新位置
let $fooContent = $("#foo-id");
let $myModal = $("#exampleModal > .modal-body");
...
// set it
$myModal.html( $fooContent.detach() );
// back it
$initialFooContentLocation.append( $fooContent.detach() );
我在 vanilla javascript 中的做法是创建一个函数来创建模态元素,然后将其附加到您想要的 DOM 元素,例如body.
一个例子:
function createModal(modalId, fooElement){
const modalDiv = document.createElement('div');
modalDiv.classList.add('modal');
modalDiv.classList.add('fade');
modalDiv.id = modalId;
const modalBodyDiv = document.createElement('div');
modalBodyDiv.classList.add('modal-body');
modalBodyDiv.append(fooElement);
return modalDiv;
}
然后用它来创建 N 个模式元素并将它们附加到任何你想要的地方,例如body,像这样:
const modal1 = createModal('myModal1', fooElement);
document.body.append(modal1)
这样您的 html 会更干净。
注意:这个fooElement
必须是DOM元素,否则会报错。
希望有用!
接受的答案对我有用;但是,为了完整起见,这里还有另一种方法。
使用 $scope/$rootScope
事件发射器在组件之间广播事件。如果组件有明确的 parent/child 关系,通常 $scope
就足够了,如果它们是兄弟姐妹,则它们可以通过 $rootScope
.
由于这是一个 angularJS 项目,我关注了 this simple guide.