Javascript 在(jquery)ajax请求中获取当前脚本DOM对象

Javascript 在(jquery)ajax请求中获取当前脚本DOM对象,javascript,jquery,reflection,tags,Javascript,Jquery,Reflection,Tags,我有一个包含一些javascript的html组件 该组件是模板引擎中的一个文件,因此可以使用它 在整个html页面的初始呈现中 作为通过ajax请求呈现的独立html javascript应应用于模板中的对象,即: <div class="grid" > <div class="item" id="item_13"> This is item 13 </div> <div class="item" id="item_14"&

我有一个包含一些javascript的html组件

该组件是模板引擎中的一个文件,因此可以使用它

  • 在整个html页面的初始呈现中
  • 作为通过ajax请求呈现的独立html
javascript应应用于模板中的对象,即:

<div class="grid" >
  <div class="item" id="item_13">
      This is item 13
  </div>
  <div class="item" id="item_14">
      This is item 14
  </div>
</div>
<script type="text/javascript">
    $(document).ready(function(){
       $(HOW_DO_I_GET_PREVIOUS_ELEMENT???).someEffect(params)
    })
</script>

这是项目13
这是项目14
$(文档).ready(函数(){
$(如何获取上一个元素??).someEffect(参数)
})
我已经检查过了,但最好的答案似乎取决于当前脚本是“scripts”变量中的最后一个脚本,因为下一个脚本尚未加载。如果我用ajax请求附加html和js,情况就不是这样了


要100%清楚:问题是如何在不引用任何特定属性的情况下获取前一个对象:标记没有唯一的id,没有随机id,因为理论上它总是有可能出现两次,没有唯一的类属性,正如完全相同的组件可以显示在HTML文档的另一部分一样。

如果您可以为
块提供一个Id,则可以轻松调用
prev()
以获取上一个元素

<script type="text/javascript" id="s2">
    $(document).ready(function(){
      $("#s2").prev().append("<h1>Prev Element</h2>");
    })
</script>

$(文档).ready(函数(){
$(“#s2”).prev().append(“prev元素”);
})

上的示例。

您需要找到一种方法,在“grid”div之后立即引用脚本标记。正如@Mark所述,最简单的方法是为脚本标记提供一个唯一的id。如果这超出了您的控制范围,但您确实可以控制脚本内容(由您创建它的事实隐含)您可以这样做:

var UniqueVariableName;
var scripts = document.getElementsByTagName('script');
var thisScript = null;
for(var i = 0; i < scripts.length; i++){
    var script = $(scripts[i]);
    if(script.text().indexOf('UniqueVariableName') >= 0){
        thisScript = script;
        break;
    }
}
if(thisScript){
    thisScript.prev().append("<h1>Prev Element</h2>");
}
var UniqueVariableName;
var scripts=document.getElementsByTagName('script');
var thisScript=null;
对于(var i=0;i=0){
thisScript=脚本;
打破
}
}
如果(此脚本){
thisScript.prev().append(“prev元素”);
}

黑客?对它有用吗?还有,是的。

这是一款在FF、Chrome和IE 8中都能正常工作的产品,在其他任何地方都没有尝试过。它在页面上最后一个元素(被解析的脚本)之前查看该元素,将其存储在本地(使用自调用函数),以便加载处理程序可以使用它


这是项目13
这是项目14
(功能(){
var节点=document.body.childNodes;
var previsibling=nodes[nodes.length-2];
$(文档).ready(函数(){
console.log(previsibling);
})
})();

话虽如此。我还必须提到,您将行为(JS)和HTML紧密耦合,将它们放在同一个文件中,这与分离它们的web流是背道而驰的。另外,我不知道您希望如何处理AJAX请求,因为您不仅仅是在呈现时将其添加到HTML中。在这种情况下,很容易获得您刚才插入的html的引用。

简单的解决方案包括两个步骤:

1) 找出脚本标记是哪个元素

2) 查找该元素的上一个同级

代码:

<div id="grid">
    <!-- ... -->
</div>
<script type="text/javascript">
    var scripts = document.getElementsByTagName("script");
    var current = scripts[scripts.length-1];
    var previousElement = current.previousSibling;
    // there may be whitespace text nodes that should be ignored
    while(previousElement!==null && previousElement.nodeType===3) {
        previousElement = previousElement.previousSibling; }
    if(previousElement!==null) {
        // previousElement is <div id="grid"> in this case
        $(document).ready(function(){
            $(previousElement).someEffect(params);
        });
    }
</script>

var scripts=document.getElementsByTagName(“脚本”);
var current=scripts[scripts.length-1];
var previousElement=当前的.previousSibling;
//可能存在应忽略的空白文本节点
while(previousElement!==null&&previousElement.nodeType==3){
previousElement=previousElement.previousSibling;}
if(上一个元素!==null){
//在本例中,previousElement为
$(文档).ready(函数(){
$(previousElement).someEffect(参数);
});
}
这是好的网络编程吗?不。您应该知道哪些元素应该根据生成的内容对其应用效果。如果您有一个id为的div,那么该id是唯一的,并且您的生成器可以告诉您,如果它生成了该div,那么它还必须生成为其设置jQuery效果的js


但是让我们忽略这一点;它有用吗?就像一个符咒。

前面的元素是指$(“第14项”)?。如果是,谁在生成这些ID?这听起来像是生成这些ID的同一件事,可以很容易地告诉JavaScript插入它。我所说的前一个元素是指grid div。问题是是否可以引用前一个元素而不引用唯一的ID,因为任何对象都可以在当前页面的多个DOM对象中表示。为此,我通常将数字id引用放在class属性中,而不是id中。id在这里被用作示例sake的注释:“@Mark:script元素中不支持id属性。我在Chrome中看到这会影响执行。”行previousElement=previous.previousSibling;应该是previousElement=previousElement.previousSibling??
<div id="grid">
    <!-- ... -->
</div>
<script type="text/javascript">
    var scripts = document.getElementsByTagName("script");
    var current = scripts[scripts.length-1];
    var previousElement = current.previousSibling;
    // there may be whitespace text nodes that should be ignored
    while(previousElement!==null && previousElement.nodeType===3) {
        previousElement = previousElement.previousSibling; }
    if(previousElement!==null) {
        // previousElement is <div id="grid"> in this case
        $(document).ready(function(){
            $(previousElement).someEffect(params);
        });
    }
</script>