获取javascript的周边元素

时间:2011-05-25 23:41:53

标签: javascript dom

我的代码如下:

<div>
  <script type="text/javascript">
    (function() { 
      var s = document.createElement('script'); 
      s.type = 'text/javascript'; 
      s.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'localhost/chat/logo.js'); 
      var t = document.getElementById('craftysyntax'); 
      t.appendChild(s, t); 
    })(); 
  </script>
<div>

我希望async'加载的文件能够做到这样的事情(注意:这不是js代码,但这是我想做的)

parent.appendChild(abc);

将在父abc中添加子元素div

那么,脚本是否可以引用其父容器?

编辑:
我为什么要这样做?
我的网站(在线商店)使用聊天程序,导航栏中的链接会根据是否有操作员登录聊天程序而更改。我试图将程序转换为使用异步加载器,但外部js如果已异步加载则不能使用document.write。我试图将脚本中的所有document.write调用转换为使用dom。

3 个答案:

答案 0 :(得分:3)

当您的代码立即执行时,最后一个script元素将是当前元素(因为同步下载和执行)。

因此,您可以获取对所有script元素的引用,然后使用length属性减去一个来获取最后一个元素。

然后,您可以使用parentNode属性访问其父节点。

<script type="text/javascript">
    var allScripts = document.getElementsByTagName('script'),
        thisScriptParent = allScripts[scripts.length - 1].parentNode;
</script>

jsFiddle

此外,无需使用三元来检查https。只需使用无协议(//localhost/chat/logo.js),它就会解析为父网站的协议。

答案 1 :(得分:0)

我认为您无法可靠地获取代码运行的脚本标记。

我不确定为什么你的logo.js脚本不只是通过它的id(“craftysyntax”)直接获取元素,但是如果你正在寻找一个更通用的解决方案(你可以说,添加多个)这些元素/脚本连续快速地连接到文档中,而不会让它们互相混乱),你可以这样做:

<div>
  <script type="text/javascript">
    (function() { 
      var s = document.createElement('script'); 
      s.type = 'text/javascript'; 
      s.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'localhost/chat/logo.js'); 
      var t = document.getElementById('craftysyntax'); 
      if (window.global_chatElems == null)
        global_chatElems = [];
      global_chatElems.push(t);
      t.appendChild(s); 
    })(); 
  </script>
<div>

然后在你的logo.js脚本中:

if (window.globalChatElems) {
  for (var i=0; i<globalChatElems.length; i++)
    processChatElem(globalChatElems[i]);
  window.globalChatElems = null;
  }

当然,如果你每页只允许其中一个元素,那么一切都要简单得多......不需要将全局变成一个数组,它只能是一个变量。

答案 2 :(得分:0)

我从学校遇到了一位老朋友,我们讨论了这个问题,并找到了解决方案。

我将让内联脚本根据当前时间(或类似的东西)创建自己的div 然后我可以将div的id传递给查询字符串中的另一个脚本。 (我已经拥有getQueryString功能)

内联

<script type="text/javascript"> 
  var randval = "helpbox" + Math.floor(Math.random()*10000);
  document.write('<div id="' + randval + '"></div>');
  (function() { 
     var csc = document.createElement('script'); 
     csc.type = 'text/javascript'; 
     csc.src = 'a1.js?divid=' + randval; 
     var s = document.getElementById('help'); 
     s.appendChild(csc, s); 
  })(); 

外部

var my_div = document.getElementById(getQuerystring('divid'));