2011-04-20 65 views
0

我之前發佈過這個問題的變體,就像我認爲我已經掌握了它,它不再工作。jQuery函數在JavaScript for-loop中不起作用。請幫助

雖然我想通了,但沒有答案。當我執行這個代碼,它工作得很好:

var $titleMarquee = '<marquee scrollamount="5" direction="left" width="233" align="left" behavior="alternate" loop="1">'; 
    for (i=0;i<=5;i++) { 
     for (j=0;j<3;j++) { 
      var $eqn = "ul.side-block-content li:eq("+i+") .article-title a span"; 
     } 
     $($eqn).replaceWith($titleMarquee+$(this).text()+"</marquee>"); 
    } 

但只要我把一個事件像.mouseenter它搞砸了,並停止工作:

var $titleMarquee = '<marquee scrollamount="5" direction="left" width="233" align="left" behavior="alternate" loop="1">'; 
for (i=0;i<=5;i++) { 
    for (j=0;j<3;j++) { 
     var $eqn = "ul.side-block-content li:eq("+i+") .article-title a span"; 
    } 
    $($eqn).mouseenter(function(){ 
     $($eqn).replaceWith($titleMarquee+$(this).text()+"</marquee>"); 
    }); 
} 

還有什麼奇怪的是,我我們發現問題的一部分是當.event和.replaceWith都有一個變量時。如果我只是給.mouseenter分配一個變量,並且使用$(this)作爲.replaceWith,它可以正常工作,但是限制了我的工作。我甚至不能使用(「+ i +」)。

這是我想用腳本實現的,它不能以這種方式工作。請幫忙。

var $titleMarquee = '<marquee scrollamount="5" direction="left" width="233" align="left" behavior="alternate" loop="1">'; 
for (i=0;i<=5;i++) { 
    for (j=0;j<3;j++) { 
     $("ul.side-block-content li:eq("+i+")").mouseenter(function(){ 
      $("ul.side-block-content li:eq("+i+") .article-title a span").replaceWith($titleMarquee+$(this).text()+"</marquee>"); 
     }); 
    } 
} 
+0

我將開始與去除內循環,並與所有三個元素的單一選擇分配是mouseenver事件的思考。這就是如果我理解正確... – Dimskiy 2011-04-20 22:33:07

+2

這是一個'選框'? o_O – Eli 2011-04-20 22:36:24

+0

注意你在哪裏聲明和使用變量。在第三個塊中,您在事件處理程序中使用了「i」,但它更改爲6,因爲它來自外部範圍。 – pepkin88 2011-04-20 22:37:01

回答

1

如何這樣的事情,而不是:

$("ul.side-block-content li").mouseenter(function() { 
    var $this = $(this); 
    var $titleMarquee = 
     $('<marquee scrollamount="5" direction="left" width="233" align="left" behavior="alternate" loop="1"></marquee>'); 

    $(".article-title a span", $this) 
     .replaceWith($titleMarquee.text($this.text())); 
}); 

這裏有一個工作示例:http://jsfiddle.net/mXtmB/

如果你想限制li元素,以便適用於前6事件:

for (var i = 0; i <= 5; i++) { 
    $("ul.side-block-content li:eq(" + i + ")").mouseenter(function() { 
     var $this = $(this); 
     var $titleMarquee = 
     $('<marquee scrollamount="5" direction="left" width="233" align="left" behavior="alternate" loop="1"></marquee>'); 

     $(".article-title a span", $this) 
      .replaceWith($titleMarquee.text($this.text())); 
    }); 
} 
+0

這完全是我所需要的。非常感謝你。 – user713052 2011-04-20 22:54:38

+0

@ user713052:沒問題,很高興幫助:) – 2011-04-20 22:55:02

0

我現在很難測試它,c嘿,如果這是工作。

var $titleMarquee = '<marquee scrollamount="5" direction="left" width="233" align="left" behavior="alternate" loop="1">'; 
var i, j; // important 
for (i=0;i<=5;i++) { 
    (function (i) { 
     $("ul.side-block-content li:eq("+i+")").mouseenter(function(){ 
      $("ul.side-block-content li:eq("+i+") .article-title a span").replaceWith($titleMarquee+$(this).text()+"</marquee>"); 
     }); 
    }(i)); 
} 

我也刪除了無意義的循環。

+0

是的,它發出了一個錯誤。 – user713052 2011-04-20 22:44:11

+0

@ user713052:再次檢查,我暗示更正。 – pepkin88 2011-04-20 22:49:32

0

當您使用$eqn變量訪問元素時,您將訪問最後一個元素,因爲變量的值在您連接事件後發生了變化。使用this關鍵字來訪問該事件掛鉤的元素:

var $titleMarquee = '<marquee scrollamount="5" direction="left" width="233" align="left" behavior="alternate" loop="1">'; 
for (i=0;i<=5;i++) { 
    $("ul.side-block-content li:eq("+i+") .article-title a span").mouseenter(function(){ 
    $(this).replaceWith($titleMarquee+$(this).text()+"</marquee>"); 
    }); 
}