2

バーのスクロールを行うJQueryコードのスニペットがあります。

PHPページにスライドするバーが3つ、4つ、... nあるので、それらに動的にIDを割り当て、それをJQueryに渡して、スニペットがmouseOverイベントで正しいバーをスライドするようにします。

これは、私の巻物の「初期化」を行うコードのスニペットです。

(function($){
 $.fn.horizontalScroll = function(options) {

 var rid = arguments[0];
 var oid = arguments[1];

 var defaults = { };

 var options = $.extend(defaults, options);

 return this.each(function() {

            var horiz_scroll = new dw_scrollObj($(this).attr('id'), $(this).children().attr('id'), $(this).children().children().attr('id'));
            horiz_scroll.setUpScrollbar("dragBar_"+rid+"_offer_"+oid, "track_"+rid+"_offer_"+oid, "h", 1, 1);
            horiz_scroll.setUpScrollControls('scrollbar_'+rid+'_offer_'+oid);

ご覧の"dragBar_"+rid+"_offer_"+oidとおり、IDを他の文字列部分に動的に連結します。

oid私が次のようなものになったときを除いて、それは大丈夫で、すべてうまくいきました-1

その場合、私は言うエラーがあります

識別子は数値リテラルの直後から始まります

StackOverflowでこのようないくつかの質問(ランダムな質問)を読んだことがあり、数値を含むすべての連結の動作を期待しているため、混乱します。

すべてが「壊れている」コードのスニペット

this.timerId = setInterval(this.animString + ".scroll()", 10);

他の場合(それが機能する場所)はどこにありますthis.animString"dw_scrollObj.col.horiz_container_outer_55_offer_-1""dw_scrollObj.col.horiz_container_outer_62_offer_234"

なぜこれが起こるのか誰でも私に説明できますか?

4

2 に答える 2

7

。という名前のグローバル変数にアクセスしようとしていますdw_scrollObj.col.horiz_container_outer_55_offer_-1。一部のブラウザでは、そのIDようにしてすべての要素にアクセスできるようになりますが、お勧めしません。

特定のケースで機能しない理由は、あなたが書いたものが有効なjavascript変数名ではないためです。変数にアクセスしようとすると、次のように解釈されます。

dw_scrollObj.col.horiz_container_outer_55_offer_ - 1

代わりにオブジェクトにアクセスする場合

document.getElementById('dw_scrollObj.col.horiz_container_outer_55_offer_-1')

また

$('#dw_scrollObj.col.horiz_container_outer_55_offer_-1')

これと同じ問題は発生しません。

あなたのsetIntervalコードにとって、それは

this.timerId = setInterval("$('#" + this.animString + "').scroll()", 10);

またはできれば

this.timerId = setInterval(function() {
   $('#' + this.animString).scroll();
}, 10);

コードがループanimString内にあり、コンテキスト内で時間の経過とともに変化する場合は、新しいクロージャーを作成する必要があります。

this.timerId = setInterval((function(x) {
    return function() {
       $('#'+x).scroll();
    };
})(this.animString), 10);
于 2012-04-18T13:13:59.557 に答える
2

渡す文字列がJavaScriptとして評価されるため、スニペットsetIntervalは壊れます。setIntervalあれは。。。になる

dw_scrollObj.col.horiz_container_outer_55_offer_-1.scroll()

ただし、ハイフン(-)は識別子では無効です。

たとえば、これはエラーをスローします

var some-name = 'foo';
于 2012-04-18T13:13:43.670 に答える