GVKun编程网logo

在通过jquery / Javascript大量添加新元素后,DOM是否立即就绪?

9

在这里,我们将给大家分享关于在通过jquery/Javascript大量添加新元素后,DOM是否立即就绪?的知识,同时也会涉及到如何更有效地AjaxHEAD通过Javascript/jQuery请求、

在这里,我们将给大家分享关于在通过jquery / Javascript大量添加新元素后,DOM是否立即就绪?的知识,同时也会涉及到如何更有效地Ajax HEAD通过Javascript / jQuery请求、JavaScript / jQuery是否总是拥有该元素的最新元素或版本?、javascript – FireFox扩展:如何通过jQuery访问页面元素?、javascript – jQuery在追加新元素之前填充内容的内容。

本文目录一览:

在通过jquery / Javascript大量添加新元素后,DOM是否立即就绪?

在通过jquery / Javascript大量添加新元素后,DOM是否立即就绪?

首先,我是JS的新手.所以我在这里有一个示例JS.

<script>
    function main(){
      code_that_add_contents_to_dom();
      code_that_works_on_added_contents_on_dom();
    }
</script>

我一直在研究一个通常遇到上述情况的网络项目.让我们假设以下功能.

var code_that_add_contents_to_dom = function(){
  var parent = document.getElementById("id_1");
  var child = document.createElement('div');
  child.id = 'child_id_1';
  parent.appendChild(child);
  ...
}

上面的函数为dom添加了新元素,并假设有很多appendChild语句.
现在让我们创建一个函数,该函数适用于上面函数附加到DOM的元素.例如,让我们假设我们在该元素中创建了一个dataTable.

var code_that_works_on_added_contents_on_dom = function(){
   var dataTable = $('#child_id_1').dataTable(); // or something similar that 
                                                 // works on prevIoUsly added                        
                                                 //elements
}

现在让我们假设我调用了函数main().问题是第二个函数要么产生错误要么根本不做任何事情.但如果我写主函数如下:

<script>
        function main(){
          code_that_add_contents_to_dom();
          setTimeout(function(){
              code_that_works_on_added_contents_on_dom();
          },some_millisecs);
        }
 </script>

如果some_millisecs有一些值,例如500(在我的特定情况下),那么一切正常.
所以这是问题.

> DOM操作方法是否需要时间来实际制作
即使在操作方法返回后,DOM也会更改?
>在这种情况下,我可以遵循的最佳做法是什么?
>或者我错过了一些简单的东西?

编辑
我已经得到了返回和使用操作DOM的函数的引用的答案.我想说清楚它并非总是如此.假设我不想从JSON文件创建dataTable(Bootstrap).在函数code_that_add_contents_to_dom();我解析JSON并动态创建标记为

<table id='example'>
 <thead>
            <tr>
                <th>Name</th>
                <th>Position</th>
            </tr>
 </thead>
<tbody>
            <tr>
                <td>Tiger Nixon</td>
                <td>System Architect</td>
            </tr>
             <tr>
                <td>Roxi</td>
                <td>System Admin</td>
            </tr>

</tbody>

</table>

现在第二个函数code_that_works_on_added_contents_on_dom();将数据表初始化为示例div.

现在我面临类似的问题,因为表标记是动态生成的,第二个函数初始化dataTable但是说“找不到数据”.但它适用于setTimeOut添加到一定延迟后初始化数据表.

我实际上通过使用dataTable.addRow()方法解决了这个问题.但我想知道的是,一旦DOM操作函数返回,为什么DOM不准备好?我希望我清楚自己

再次感谢!!

解决方法

而不是让code_that_works_on_added_contents_on_dom查找您刚刚创建的元素的引用,您可以在创建它们时使用您已经获得的引用.

除了1:混淆纯DOM函数(document.getElementById(“child_id_1”))和jQuery($(‘#child_id_1’))令人困惑.如果您选择一种方法并支持它,它将使一切更易读和更容易.

除了2:在code_that_add_contents_to_dom中,您要查找ID为child_id_1的元素,但为您创建的新元素分配相同的ID.我假设这是示例代码中的错误.但是你使用的是child.ID,无论如何都应该是child.id.同样使用我的方法,您无需分配ID,因为您将使用现有的引用.

例:

<script>
    function main(){
      var createdElements = code_that_add_contents_to_dom();
      code_that_works_on_added_contents_on_dom(createdElements.elementA,createdElements.elementB);
    }

var code_that_add_contents_to_dom = function(){
  var parent = $("#child_id_1"); // Use jQuery everywhere
  var child = $("<div>");
  parent.appendChild(child);
  return {
    elementA: parent,elementB: child
  };
}  

code_that_works_on_added_contents_on_dom(parent,child) {
  child.dataTable();
}
</script>

Ajax HEAD通过Javascript / jQuery请求

Ajax HEAD通过Javascript / jQuery请求

我似乎在制作HEAD请求时遇到了一些问题,并保留了数组中数据的完整性.

鉴于此片段:

var imageTemp = Array();

$('*')
    .each(function(index){
        if($(this).css('background-image') != 'none'){
            imageTemp.push($(this).css('background-image').slice(5, -2));
        }
    });

我捕获给定页面上所有背景图像的URL.现在,尝试通过HEAD请求内容长度来获取每个图像的大小,我使用此代码段:

var imageData = Array();

for(var i = 0; i < imageTemp.length; i++){
    ajaxSizeRequest = $.ajax({
        type: "HEAD",
        async: true,
        url: imageTemp[i],
        success: function(message){
            imageData.push([imageTemp[i], ajaxSizeRequest.getResponseHeader('Content-Length')]);
        }
    });
}

但是,当我通过console.log转储imageData时,我的每个元素(应该是包含URL和内容长度的数组)最终为[undefined,XXXX],其中XXXX始终是最后请求的Content-Length的大小

我很难过,虽然这似乎是一个时间/范围问题.我在这里遇到过某种竞争条件吗?

解决方法:

问题是回调函数捕获的单个变量i和ajaxSizeRequest对于回调函数的所有实例都是相同的变量.我想如果你调用一个函数并将索引变量传递给它,同时将请求变量本地范围扩展到函数本身使用done处理程序的响应参数,你最终应该得到回调捕获的独立变量.然后它应该正确引用每个数组元素和每个响应变量.

var imageData = Array();

for(var i = 0; i < imageTemp.length; i++){
    updateImageData( i );
}

function updateImageData( i )
    $.ajax({
        type: "HEAD",
        async: true,
        url: imageTemp[i],
    }).done(function(message,text,jqXHR){
        imageData.push([imageTemp[i], jqXHR.getResponseHeader('Content-Length')]);
    });
}

JavaScript / jQuery是否总是拥有该元素的最新元素或版本?

JavaScript / jQuery是否总是拥有该元素的最新元素或版本?

我正在编写一个用于获取元素的用户脚本:

var theElement = $('div.someClass:last');

要获取类.someClass中的最后一个元素,以便我可以解析它.

这就是我的问题所在.此页面上还有另一个脚本动态添加一个新的< div class =“someClass”>每过一段时间.我希望始终在页面上的最后一个元素选择一个.someClass类.

Javascript / jQuery会不会有最新的元素,还是我必须手动“刷新”它?

解决方法

Sushanth的回答是正确的,但根据 this article你可以使用

var theElements = document.getElementsByClassName('someClass');

然后可靠地使用

var theElement = $(theElements[theElements.length - 1]); // wrapping in $() is optional

这是值得做的$(选择器)是一个非常昂贵的操作.

编辑 – 仅适用于ie9及以上虽然http://caniuse.com/getelementsbyclassname

javascript – FireFox扩展:如何通过jQuery访问页面元素?

javascript – FireFox扩展:如何通过jQuery访问页面元素?

我使用以下代码:

   var myExtension = {
    init: function() {
        // The event can be DOMContentLoaded, pageshow, pagehide, load or unload.
        if(gbrowser) gbrowser.addEventListener("DOMContentLoaded", this.onPageLoad, false);
    },
    onPageLoad: function(aEvent) {
        var doc = aEvent.originalTarget; // doc is document that triggered the event
        var win = doc.defaultview; // win is the window for the doc
        //alert("page is loaded \n" +doc.location.href);
       // alert(doc.location.href.indexOf("facebook.com"));
        if(doc.location.href.indexOf("facebook.com") == -1) 
        {
            return;
        }
        alert("we are here");
        alert($("#blueBar").html());
    }
}
window.addEventListener("load", function load(event){
    window.removeEventListener("load", load, false); //remove listener, no longer needed
    myExtension.init();  
},false);

它不断给出未定义的错误

解决方法:

$()默认使用当前窗口的文档.在你的情况下,这实际上是browser.xul.你需要对你已经通过var doc = aEvent.originalTarget;获得的子文档进行操作,所以这应该工作我认为(未经测试)

$(doc).find("#blueBar")

javascript – jQuery在追加新元素之前填充内容

javascript – jQuery在追加新元素之前填充内容

我正在尝试使用数据填充特征,然后将其附加到#wrapper.这不适合我.我究竟做错了什么?

var featured = '<div id="featured"></div>';
$('#imageTable tbody tr td img').each(function(){
    $(featured).append($(this).attr('src'));
});
$(featured).appendTo('#wrapper');

解决方法:

var $featured = $('<div id="featured"></div>');
$('#imageTable tbody tr td img').each(function(){
    $featured.append($(this).attr('src')).append('<br />');
});
$featured.appendTo('#wrapper');

阐释:

当你在循环$(特色)中执行此操作时,它会为每个选定元素创建一个NEW div,因此只有最后一个div将附加到#wrapper.您需要在每个循环之外创建jQuery对象.

今天关于在通过jquery / Javascript大量添加新元素后,DOM是否立即就绪?的讲解已经结束,谢谢您的阅读,如果想了解更多关于Ajax HEAD通过Javascript / jQuery请求、JavaScript / jQuery是否总是拥有该元素的最新元素或版本?、javascript – FireFox扩展:如何通过jQuery访问页面元素?、javascript – jQuery在追加新元素之前填充内容的相关知识,请在本站搜索。

本文标签: