Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在插入元素时高效地执行JavaScript函数?_Javascript_Jquery_Dom_Dynamic - Fatal编程技术网

如何在插入元素时高效地执行JavaScript函数?

如何在插入元素时高效地执行JavaScript函数?,javascript,jquery,dom,dynamic,Javascript,Jquery,Dom,Dynamic,最初,当页面加载时,我使用jQuery搜索如下内容: <label for="first_name">name</label> <input type="text" name="first_name" /> var elem = $('<p></p>').text('hello').appendTo(document.body); adjust_html(elem); 使用绑定方法 将与当前事件匹配的所有元素的处理程序附加到事件 选

最初,当页面加载时,我使用jQuery搜索如下内容:

<label for="first_name">name</label>
<input type="text" name="first_name" />
var elem = $('<p></p>').text('hello').appendTo(document.body);
adjust_html(elem);
使用绑定方法

将与当前事件匹配的所有元素的处理程序附加到事件 选择器,现在和将来

您可以签出:


按如下方式创建html:

<label for="first_name">name</label>
<input type="text" name="first_name" />
var elem = $('<p></p>').text('hello').appendTo(document.body);
adjust_html(elem);
var elem=$('

').text('hello').appendTo(document.body); 调整html(元素);
好吧,也许我没有正确解释我想要什么。其目的是基本上能够在新插入的html上高效地运行一组函数,而无需手动调用它们

现在我将使用我在下面编写的代码。最初,页面上有模板,并将某些选择器(存在于模板中)的函数绑定到所有模板。因此,当您将模板插入页面时,这些选择器会尝试匹配模板内部,并运行绑定函数

下面的代码既没有效率,也没有经过优化或彻底测试。所以,我不会接受它作为最终答案。这只是一个简单的解决方案,而且有点粗糙。但它是有效的。我相信,或者一些插件会做得更好,所以我将等待JS专家给出正确的方法

作为旁注:我意识到有两个缺点:a)设置html的方法必须通过模板对象来完成,而不是通过自然的jQuery方式,并且b)模板被插入DOM中,然后函数才开始在其上运行。在插入模板之前,我的第一个版本确实对模板起作用,但是像
.replaceWith()
这样的函数在字符串上的作用与在DOM节点上的作用并不完全相同。从好的方面来说,代码很小,而且正是我想要的

<html>
<body>
<head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
    <script type="text/javascript">

        window.template = {
            queue: {},
            set: function(container, content) {

                /* first insert content */
                container.html(content);

                /* now run a list of functions in the queue */
                $.each(this.queue, function(s, fs) {
                    var el = $(s, container);
                    for (var i = 0, len = fs.length; i < len; ++i)
                        el.each(fs[i]);
                });

            },
            bind: function(selector, func) {
                if (typeof this.queue[selector] === 'undefined')
                    this.queue[selector] = [];
                /* push function to queue for that specific selector */
                this.queue[selector].push(func);
            }
        };

        $(function() {

            var templateContents = $('#my-template').html();

            /* for each <label>, replace it with another <input> */
            template.bind('label[for="first_name"]', function() {
                $(this).replaceWith('<input type="text" name="last_name" value="last name" />');
            });

            $('a').click(function(e) {

                e.preventDefault();
                $('body').append('<div class="container"></div>');

                /* get the div that we just appended to body */
                var newDiv = $('.container').last();

                /* set that newDiv's html to templateContents, and run binded functions */
                template.set(newDiv, templateContents);

            });

        });

    </script>
</head>
<body>
    <script id="my-template" type="text/template">
        <label for="first_name">name</label>
        <input type="text" name="first_name" />
    </script>
    <a href="#">add dynamically</a>
</body>
</html>

window.template={
队列:{},
集合:函数(容器、内容){
/*第一次插入内容*/
html(content);
/*现在运行队列中的函数列表*/
$.each(this.queue,function(s,fs){
变量el=$(s,容器);
对于(变量i=0,len=fs.length;i
我用jQuery这样的东西搜索。。。这是一个用词不当的问题,下面几行中没有jquery。在问题的上下文中这意味着什么?@JaredFarrish-我想他是说“我用jQuery搜索像这样的东西”。@Justin-这完全可能…@JaredFarrish我是说我用jQuery搜索那些元素。已编辑。@Jon-最好提供底层/相关代码<代码>:)。注意:这允许将事件处理程序绑定到新元素。如果希望在插入时运行操作,最好在插入之前运行该代码,这样渲染引擎就不必回流。@JaredFarrish:Yes
delegate()
在某些情况下速度更快,具体取决于选择器、DOM树、事件冒泡/传播需要以及其他一些高级功能。但是是的,指出这种方法作为替代方法也是个好主意。@Mufasa那么我应该这样做吗$('label').live('load',function(){});这与问题的要求不符
.live()
不会在添加新元素时通知他们。此外,
.load()
事件不适用于
.live()
。这个问题不是关于新对象的事件处理程序,而是关于知道何时将新对象添加到页面中,以便对其进行样式设置/改进。@JonDerring:否,不绑定到“加载”处理程序。这将用于绑定“单击”处理程序等。这是否是正确的解决方案取决于您在函数中执行的操作。您是否正在添加事件处理程序(如果是,那么,是的,或者您正在处理CSS、数据等)(如果是,请参阅我在插入时关于这样做的其他注释,或者@mre666的回答)?更多代码将有助于提供上下文,并帮助我们更具体地回答您。