1

私は Magento を使っていますが、組み込みのプロトタイプ #%@$ にはうんざりです!! 「Pre-Select Colors Plus Swatches」拡張機能を持っていますが、ページの読み込み時に製品の色属性を事前に選択する機能がなかったため、これにも腹を立てています。また、jQuery noConflict() を機能させるために数時間を費やしましたが、前述の拡張機能が正確にクラッシュします。だから私はそのjQueryコードが機能することになり、それをPrototypeに変換する必要があります.これは不可能に思えます! この関数は、最初に使用可能なカラー オプションのクリックをシミュレートし、ページの読み込み後に呼び出します。プロトタイプで可能ですか?どのように ???

$j("div.atributoProduto.Cor img.swatch:not('.disabledSwatch'):first").parent().click();

また、jQueryとprototypeを共存させる奇跡のコードを思いつくことができればいいですね。しかし、私はいくつかの研究を行い、それを行うために多くの方法を試しました...

4

3 に答える 3

1

プロトタイプ コードの前に jQuery をロードしてから、noConflict を呼び出すようにしてください。$jおそらく、置換変数として使用しないで、jQuery代わりに使用するか、衝突の可能性が非常に低い、短くない何かを使用してください。

//Load jQuery
<script>
  var jQuery = jQuery.noConflict();
</script>
//Load other Javascripts including Prototype

Prototype と jQuery は完全に共存できるはずです。最初に jQuery をロードすると、Prototype が起動する前にグローバル名前空間から消去されます。このようにして、競合することはありません。

jQuery の短い名前は必要ありません。$

jQuery("div.atributoProduto.Cor img.swatch:not('.disabledSwatch'):first").parent().click();

プロトタイプの後に jQuery を noConflict モードでロードすることはよくある間違いであり、jQuery は$再度クリアする前にデータを入力するため、ロードアップ中の短時間で競合する可能性があるため、競合が発生する可能性があります。


プロトタイプでクリックをトリガーしたい場合:

$(myelement).simulate('click');

.click();これは、jQueryの場合とほぼ同じです。

于 2012-07-18T13:11:56.590 に答える
0

さて、私は100%プロトタイプソリューションに行き着きました。シミュレーションメソッドは、インターネットにあるプラグインです。私の最大の問題は、プロトタイプがjQueryほどチェーンを好まないことでした。

Event.simulate = function(element, eventName) {

      var options = Object.extend({
        pointerX: 0,
        pointerY: 0,
        button: 0,
        ctrlKey: false,
        altKey: false,
        shiftKey: false,
        metaKey: false,
        bubbles: true,
        cancelable: true
      }, arguments[2] || { } );

      var eventMatchers = {
        'HTMLEvents': /load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll/,
        'MouseEvents': /click|mousedown|mouseup|mouseover|mousemove|mouseout/
      };

      var oEvent, eventType = null;

      for (var name in eventMatchers) {
        if (eventMatchers[name].test(eventName)) eventType = name;
      }

      if (!eventType) throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported');

      if (document.createEvent) {
        oEvent = document.createEvent(eventType);
        if (eventType == 'HTMLEvents') {
          oEvent.initEvent(eventName, options.bubbles, options.cancelable);
        }
        else {
          oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, 
            options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
            options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, $(element));
        }
        $(element).dispatchEvent(oEvent);
      }
      else {
        options.clientX = options.pointerX;
        options.clientY = options.pointerY;
        oEvent = Object.extend(document.createEventObject(), options);
        $(element).fireEvent('on' + eventName, oEvent);
      }
}

function selecionaOnload( atributo ){
    var elem = $$("div.atributoProduto."+atributo+" img.swatch:not(.disabledSwatch)").first();
    Event.simulate( elem, 'click');

    if(atributo == 'Cor'){
        $$("div.atributoProduto.Tamanho div.ico-esgotado").each(function(elem){
            elem.remove();
        });
        marcaIndisponivel('Tamanho');
    }
}

function marcaIndisponivel( atributo ){
    $$("div.atributoProduto."+atributo+" img.swatch.disabledSwatch").each(function(elem){
        elem.insert( {before:"<div class='ico-esgotado'></div>"} );
    });
}

Event.observe(window, 'load', function() {  

    //marcaIndisponivel('Cor');
    selecionaOnload('Cor');
    marcaIndisponivel('Tamanho');
    //selecionaOnload('Tamanho');

});
于 2012-07-31T20:23:16.060 に答える
0

あなたの質問を間違って理解していない場合は、プロトタイプ js で $$ を使用するとこれが解決するはずです。プロトタイプは、not、nth、first などの疑似クラスもサポートします。ここで見ることができます。

于 2012-07-31T06:39:41.300 に答える