2010-07-15 30 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