2012-04-30 10 views
1

私は、当社が開発した独自の電子商取引プラットフォームを開発中です。私はフロントエンドの開発に厳密に関与しています。デフォルトのJavascriptイベントとJqueryの対話

ショッピングカートの多くは、インラインJavaScriptイベントを利用してデータをデータベースに送信しています。私は近い将来Jqueryにインライン・ジャバスクリプトを変換する予定ですが、現在はそのままです。

私が持っている特定の問題の1つは、カート内の各広告申込情報で繰り返される「カートからアイテムを削除」アイコンです。私はちょうどにユーザーを求めて、この「カートからアイテムを削除」アイコンをクリックしたときにポップアップするためにjQueryのダイアログボックスを追加

document.SPI_KitFormName.SPI_KitOrdQtyFieldName.value='DEL'; 
document.SPI_KitFormName.Action.value='Recalc_Kit'; 

:javascriptのカートからアイテムを削除するには、バックエンドDelphiのコードを利用していますイベントのインラインがあります確認してください。ダイアログボックスに「アイテムの削除」と「キャンセル」ボタンを追加しました。

私が遭遇した問題は、アイコンがクリックされたときに、インラインのJavaScriptイベントがダイアログボックスのjqueryの前に実行されることでした。私はそれを得る。そこで、jQueryコードe.preventDefault()を追加して、インラインJavaScriptが最初に実行されないようにしました。問題は、ダイアログボックスの[アイテムの削除]ボタンを押したときに再び有効にする方法がわかりません。あなたが提供することができます任意の助け

var currentForm; 
$(function() { 
    jQuery('#confirm-itemdelete').dialog({ 
     autoOpen: false, 
     height: 160, 
     modal: true, 
     resizable: false, 
     buttons: { 
      'Delete Item': function() { 
       $(this).dialog("close"); 
       $(".deleteitembutton a").die('click'); 
       currentForm.submit(); 
      }, 
      'Cancel': function(){ 
       $(this).dialog("close"); 
      } 
     } 
    }); 

    $('.deleteitembutton a').live('click', function(e) { 
     currentForm = $(this).closest('form'); 
     e.preventDefault(); 
     $('#confirm-itemdelete').dialog('open'); 
    }); 
}); 

ありがとう:

は、ここに私の現在のコードです。私は、これはあなたがそれを提出したいときにtrueに設定し、その後、提出からフォームを防ぐことになると思い

currentForm.submit = function(){ 
    return false; 
} 

+0

'.preventDefaul()'呼び出しは、属性ベースのイベントハンドラとは関係ありません。これは* browser *のデフォルトアクションを防ぐためのものです。このようなケースでは、イベントハンドラの順序を制御することはほとんどありません。 – Pointy

+0

インラインJavaScriptを今すぐ変換してみませんか?最初の場所で正しく動作させるのではなく、この相互作用をハッキングするために余分な時間と労力を費やすようです。 –

答えて

0

あなたはこのような何かを行うことができます。

+0

問題は、onclickが最初に起動し、確認ダイアログが表示されるため、この値を実際に設定することです。その時点でjavascriptを使ってフォームの提出を再開することもできますが、これはオプションになる可能性があります。 –

0

これはすばやく、汚い方法でこれを動作させることができます。ドキュメントの準備ができたら、問題の要素のインラインコードをすべて切り取って、要素のデータ属性に文字列として格納するスクリプトを実行します。クリックするボタンを保存するには、より高いレベルの変数が必要です。

$(document).ready(function(){ 
    var buttonClicked; // Lets you know which one was just clicked. 
    $('.deleteitembutton a')each(function(){ 
     $(this).data('cEvent', $(this).attr('onClick')); 
     $(this).removeAttr('onClick'); 
    }); 
} 

Iは、インラインスクリプトはそれがであるものは何でも属性を持つ「のonClick」を置き換えるために結ばれている属性を知りません。

あなたが変更する必要がありますことをやった後あなたのダイアログコードを少しして、新しいイベントを作成してください。

// Add this to the 'click' event 
buttonClicked = $(this); 

// The new event 
$('.deleteitembutton a').on('newEvent', function() { 
    eval($(this).data('cEvent')); 
} 

// Add this line to your 'Delete Item' button in your dialog 
$('.deleteitembutton a').trigger('newEvent'); 

// Add this to your 'Cancel' button in your dialog 
buttonClicked = ''; 

私が言ったように、これはすばやく汚れていますが、ちょうどそのトリックを行うかもしれません。

1

これはまだonclicksを経由して、プレゼンテーション層等で自分自身を交絡を主張するので、多くのバックエンドシステムの習慣を与えられ、珍しいことではありません問題があります。非常にイライラしています。

インラインonclickイベントですべてを行うことを主張するJSFのために、この同じ状況に遭遇しました。

解決策はハックですが、機能します。私が行うことは、ページのレンダリング時に、すべてのonclick属性を取得し、それらをjqueryデータプロパティとしてキャッシュし、元のonclickを削除します。

次に、自分のjQueryイベントをそれらにバインドして、ロジックに基づいて、元のオンクリックを起動するかどうかを決定できます。

例:文書準備ができた後

<span id="test" onclick="alert('onclick')">test</span> 

、私はonclickのキャッシュ:

$('#test') 
    .data('inlineOnclick',$('#test').attr('onclick')) 
    .removeAttr('onclick'); 

私はその後、結合し、私自身のクリックイベントを

$('#test') 
    .click(function(){ 
     if(confirm('delete this?')){ 
      //fire off original onclick event via anonymous function 
      var anonFunc = eval("(function(){" + $(this).data('inlineOnclick') + "})"); 
      anonFunc.call(this); 
     } 
    }); 

サンプル:http://jsbin.com/ebotam

それは、ほとんどの人がevalを悪用しているように見せてくれることを悲鳴を上げることに注意してください。おそらくそうです。これを処理するにはもっと良い方法があるかもしれませんが、今はOKの回避策として私のために働いています。また、インラインonclickも悪いので、おそらく悪と戦うのはOKです。 ;)

+0

ありがとう、すべて。私が問題に間違って近づいているという一般的な合意のようです。イベントの発生順序を制御するのではなく、すぐにonclick属性を削除するのが最善の方法です。私は様々な解決策を試し、報告して戻します。他の誰かが別のアプローチをしているなら、私はそれを見てうれしいです。ありがとう! – dentalhero

関連する問題