2010-07-15 85 views
0

链接我有一个jQuery插件,我叫这样:的jQuery在IE

$(function() { 

    $('.link_class').jquery_plugin() 
}) 

许多锚标记在体内

<a href="http:...." class="link_class">link 1 </a> 
<a href="http:...." class="link_class">link 2 </a> 
<a href="http:...." class="link_class">link 3 </a> 

的jQuery插件的设置是这样的:

$.fn.jquery_plugin = function(options) {   

    if ($(this).is('a')) {  

     this.each(function() { 


      $(this).bind('click', function(){ 


        options.content = options.content || $(this).attr('href'); 


       return javascript_plugin (options), false; 



      }) 


     }) 

    } 

}; 

javascript_plugin = function (options) { 

     return alert(options.content); 

}; 

我的问题是,当我使用的IE链接,我先点击将决定与内容显示在警报。因此,如果我点击链接2首先从链接2的href将显示无论哪个链接我点击那里后... 任何想法,我可能做错了什么? 谢谢

回答

1

总的来说你在寻找的变化是这样的:

$.fn.jquery_plugin = function(options) {   
    options = options || {}; 
    return this.filter('a').bind('click', function() { 
    var content = options.content || $(this).attr('href'); 
    return javascript_plugin ({ 'content': content }); 
    }).end(); 
}; 

javascript_plugin = function (options) { 
    return alert(options.content); 
}; 

You can try it here,也出现过一些问题,我们会去在代码顺序:

  • options将是不确定的喜欢你的例子打电话时,需要在访问options.content时考虑到这一点。
  • .is('a')检查必须元素(否则它检查组的任何元素,所以不是做一个.filter('a').bind()
  • 您需要返回集合保持链接,这现在确实是(公告在.end()所以我们不返回.filter()版本集)。
  • 最后,不要修改选择对象,这就是为什么你都拿到第一个链接的行为。有
+0

如果任何元素匹配,则'is'方法返回true,而不仅仅是第一个。 – belugabob 2010-07-15 11:13:26

+0

关于从插件返回“this”的好处,以便链接可以发生 - 我添加了“返回此内容”。以我的例子。 – belugabob 2010-07-15 11:17:31

+0

@belugabob - 我说错存在,但它是不正确无论哪种方式,如果你只是要附加到''元素和你有非''在集合:) – 2010-07-15 11:19:02

2

我不是100%确定每个'this'引用的上下文,以及他们是否引用隐含在本地函数调用中的'this'或是否隐含在本地函数调用中的'this'封闭功能,但这可能与解释有关。

无论哪种方式,你的代码都有一个小小的缺陷,只有当你将一个'linkClass'赋给一个不是'a'的元素时才会出现。为了解决这个问题,请在循环内检查'a',因为如果jquery集合中的任何项目与条件匹配,那么'is'方法将返回true,并且在循环之外完成时,会导致所有元素有绑定到这些click处理,不管他们是否是一个“一”或不...

$.fn.jquery_plugin = function(options) {   
    this.each(function() { 
     if ($(this).is('a')) {  
      $(this).bind('click', function(){ 
       options.content = options.content || $(this).attr('href'); 
       return javascript_plugin (options), false; 
      }) 
     }) 
    } 
    return this; 
}; 

javascript_plugin = function (options) { 
    return alert(options.content); 
}; 

另外,只需在“A”在你的插件的调用中使用的选择...

$(function() {  
    $('a.link_class').jquery_plugin()  
})  

...并删除在插件的 'a' 检查的需要...

$.fn.jquery_plugin = function(options) {   
    this.each(function() { 
     $(this).bind('click', function(){ 
      options.content = options.content || $(this).attr('href'); 
      return javascript_plugin (options), false; 
     }) 
    } 
    return this; 
}; 

对我来说,最大的问题是最后的'this'是指被点击的DOM元素,还是当前迭代'each'循环的元素。它应该是前者。

编辑:

我现在看到的问题 - 事实上,“选项”只被设置为元素的href的值,如果它目前是空的。在此之后,它被留下,并保留之前设定的值。尝试创建一个局部变量,而不是...

$.fn.jquery_plugin = function(defaultOptions) {   
    this.each(function() { 
     $(this).bind('click', function(){ 
      var options = createAnOptionsInstance(); //do what it says 
      options.content = defaultOptions.content || $(this).attr('href'); 
      return javascript_plugin (options), false; 
     }) 
    } 
    return this; 
}; 

原密码不显示在给插件传递的任何选项,所以你可能需要一些这方面的额外的检查。

+0

喜, 感谢您的解决方案。这正是我所需要的。由于某些原因,IE浏览器并不了解“每个”,因为我认为。我的问题是,有时会传递一个称为内容的选项。所以我想让这个插件保持打开状态,所以当这个选项通过时它会被使用,否则插件会从href中获取内容。 我以前的工作方式在FF,Safari,Opera中正常工作,但不在IE中。有什么建议么? 谢谢 – salmane 2010-07-15 12:51:14

+0

我刚刚注意到你的主题帖子提到了IE并开始怀疑其他浏览器,然后我发现了你的评论。我非常肯定,每个浏览器的'each'函数都是一样的,所以会怀疑它的处理方式。你可以发布一些例子,将选项传递给插件吗? – belugabob 2010-07-15 13:13:14

+0

只是为了让你更好的理解插件的功能:它是一个ajax/html对话框。有时这些内容是一个选项,例如:content:'

Hello world
',但是当内容选项未被传递时,插件默认会对存储在href中的链接进行ajax调用。我想互联网浏览器是不宽容的。再次感谢 您的帮助 – salmane 2010-07-15 13:26:40