0

すべてのボタンのページをスキャンし、それぞれのクリックをデータベースに記録するスクリプトがあります。残念ながら、ボタン データは 2 回目のクリックまで送信されません。正しい場所で addEventListener と removeEvent リスナーを使用していますか?

var trkButtons = document.getElementsByTagName('input');

for (var i = 0; i < trkButtons.length; ++i) {

    //submit button
    if (trkButtons[i].getAttribute("type") == "submit") {
        trkButtons[i].addEventListener("click", addBtnClickListener, false);
    }

    //image button
    if (trkButtons[i].getAttribute("type") == "image") {
        trkButtons[i].addEventListener("click", addBtnClickListener, false);
    }

    //file upload
    if (trkButtons[i].getAttribute("type") == "file") {
        trkButtons[i].addEventListener("click", addBtnClickListener, false);
    }
    else { }
}

function addBtnClickListener(e) {
    e.preventDefault();

    this.click();
    this.removeEventListener('click', addBtnClickListener, false);

    var eventType = "button.click";
    var ctrBtnText = this.value;
    track(this, eventType, '', '', ctrBtnText, '', '', '');

}
4

1 に答える 1

0

addBtnClickListenerさて、ここにあなたの関数 が何をするかがあります:

  1. デフォルト アクションの実行を防止します (フォームの送信、ファイルのアップロード ウィンドウを開く)
  2. この関数をもう一度実行します
  3. クリックされた要素からこのイベント リスナーを削除します
  4. ログのもの

フォーム送信は、最初はステップ 3 で実際にフォーム送信を妨げるこのイベント ハンドラーを削除するため、2 回目は機能します。
フォームの送信、ファイルのアップロード ダイアログを開くなどのデフォルトの動作を防止したくない場合は、 を使用しないでくださいe.preventDefault()

考えられる解決策:

function addBtnClickListener(e) {
    // the code below will be executed, before the form is submitted
    // no need for other action if this is all we do
    var eventType = "button.click";
    var ctrBtnText = this.value;
    track(this, eventType, '', '', ctrBtnText, '', '', '');
}

preventDefault を使用する理由:

function validateForm(e) {
    var data = document.getElementById('someData').value;
    if (isValid(data) === false) {
        e.preventDefault();
        // ask user to correct invalid data here
    }
}

注:フォームを手動で送信することもできますがthis.form.submit()、デフォルトのアクションで自動的に行われるため、通常は必要ありません。

于 2013-09-14T00:46:32.813 に答える