2009-10-16 28 views
1

我正在爲Facebook開發遊戲。我使用PHP和FBJS。我使用addEventListener()將事件附加到兩個按鈕。每個按鈕都有它自己的事件處理程序,這是一個js函數。第一個事件處理函數(loadNewCargo())被調用時沒有問題。但第二個事件處理程序(discardExistingCargo())會在頁面調用時刷新頁面。我見過的例子使用單個事件處理函數來處理多個元素。我爲每個元素創建一個處理程序。這是非法的嗎?下面的代碼(「加載新提交」和「放棄已有提交」是該對話框上的兩個按鈕的ID):addEventListener()問題/怪異行爲

function loadCargo() { 
    var actionPrompt = document.getElementById('action-prompt'); 
    actionPrompt.setTextValue('Loading cargo...'); 

    var ajax = new Ajax(); 
    ajax.responseType = Ajax.JSON; 
    ajax.ondone = function(data) { 
//debugger; 
    ajax.responseType = Ajax.FBML; 
    ajax.ondone = function(fbjsData) { 
//debugger; 
     if(data.loadableCargo.length == 0) { 
     moveTrainManual(); 
     } else { 
     var dialog = new Dialog().showChoice('Load Cargo', fbjsData, 'Minimize', 'Pass'); 

     var dlgBtnNew = document.getElementById('load-new-submit'); 
     dlgBtnNew.cityId = data.loadableCargo.city_id; 
     dlgBtnNew.trainId = data.loadableCargo.train_id; 
     dlgBtnNew.addEventListener('click', loadNewCargo); 
/**/ 
     var dlgBtnDiscard = document.getElementById('discard-existing-submit'); 
     dlgBtnDiscard.cityId = data.loadableCargo.city_id; 
     dlgBtnDiscard.trainId = data.loadableCargo.train_id; 
     dlgBtnDiscard.addEventListener('click', discardExistingCargo); 
/**/ 
     dialog.onconfirm = function() { 
      // Submit the form if it exists, then hide the dialog. 
      dialog.hide(); 
      actionPrompt = document.getElementById('action-prompt'); 
      actionPrompt.setInnerXHTML('<span><div id="action-text">'+ 
      'The "Load cargo" dialog has been minimized'+ 
      '</div>'+ 
      '<div id="action-end">'+ 
      '<form action="" method="POST">'+ 
      '<input type="button" value="Maximize" id="next-phase" onclick="loadCargo();" />'+ 
      '</form>'+ 
      '</div></span>'); 
      actionButton = document.getElementById('next-phase'); 
      actionButton.setValue('Maximize'); 
      actionButton.addEventListener('click', loadCargoEventHandler); 
     }; 
     dialog.oncancel = function() { 
      moveTrainManual(); 
     } 
     } 
    } 
    ajax.post(baseURL + '/turn/load-cargo-dialog-fbjs', data); 
    } 
    ajax.post(baseURL + '/turn/load-cargo'); 
} 

function loadCargoEventHandler(evt) { 
    if(evt.type == 'click') { 
    var dialog = new Dialog().showChoice('Load Cargo', fbjs_load_cargo_select, 'Minimize', 'Pass'); 
    dialog.onconfirm = function() { 
     // Submit the form if it exists, then hide the dialog. 
     dialog.hide(); 
     var actionPrompt = document.getElementById('action-prompt'); 
     actionPrompt.setInnerXHTML('<span><div id="action-text">'+ 
     'The "Load cargo" dialog has been minimized'+ 
     '</div>'+ 
     '<div id="action-end">'+ 
     '<form action="" method="POST">'+ 
     '<input type="button" value="Maximize" id="next-phase" onclick="loadCargo();" />'+ 
     '</form>'+ 
     '</div></span>'); 
     var actionButton = document.getElementById('next-phase'); 
     actionButton.setValue('Maximize'); 
     actionButton.addEventListener('click', loadCargoEventHandler); 
    }; 
    dialog.oncancel = function() { 
     moveTrainManual(); 
    } 
    } 
} 

function loadNewCargo(evt) { 
    //new Dialog().showMessage('loadNewCargo', 'city id='+cityId+', train id='+trainId); 
//debugger; 
    cityId = evt.target.cityId; 
    trainId = evt.target.trainId; 

    ajax = new Ajax(); 
    ajax.responseType = Ajax.JSON; 
    param = { 'load-cargo-submit': "Load new goods", 'city-id': cityId, 'train-id': trainId }; 
    ajax.ondone = function(data) { 
    openCargoHolds = data.openCargoHolds; 
    cargoHoldsUsed = 0; 
    ajax.responseType = Ajax.FBML; 
    param = { 'openCargoHolds': data.openCargoHolds, 'cityGoods': data.cityGoods, 'trainId': data.trainId }; 
    ajax.ondone = function(fbjsData) { 
//debugger; 
     var dialog = new Dialog().showChoice('Load Cargo', fbjsData, 'Load cargo', 'Cancel'); 
     dialog.onconfirm = function() { 
     var goods = []; 
     var goodsIds = []; 
     numGoods = document.getElementById('goods-count').getValue(); 

     for(var i = 0; i < numGoods; i++) { 
      j = i + 1; 
      goods[i] = document.getElementById('goods-' + j).getValue(); 
      goodsIds[i] = document.getElementById('goods-id-' + j).getValue(); 
     } 
     var trainId = document.getElementById('train-id').getValue(); 
     param = { "goods": goods, "goods-id": goodsIds, "train-id": trainId }; 
     ajax.responseType = Ajax.JSON; 
     ajax.ondone = function(data) { 
      loadCargo(); 
     } 
     ajax.post(baseURL + '/turn/do-load-cargo-new', param); 
     //dialog.hide(); 
     }; 
     dialog.oncancel = function() { 
     loadCargo(); 
     } 
    } 
    ajax.post(baseURL + '/turn/load-cargo-new-dialog-fbjs', param); 
    } 
    ajax.post(baseURL + '/turn/load-cargo-select', param); 
} 

function discardExistingCargo(evt) { 
    //new Dialog().showMessage('loadNewCargo', 'city id='+cityId+', train id='+trainId); 

    cityId = evt.target.cityId; 
    trainId = evt.target.trainId; 
/**/ 
    ajax = new Ajax(); 
    ajax.responseType = Ajax.JSON; 
    param = { 'load-cargo-submit': "Discard existing goods", 'city-id': cityId, 'train-id': trainId }; 
    ajax.ondone = function(data) { 
    ajax.responseType = Ajax.FBML; 
    param = { 'openCargoHolds': data.openCargoHolds, 'trainGoods': data.trainGoods, 'trainId': data.trainId }; 
    ajax.ondone = function(fbjsData) { 
     var dialog = new Dialog().showChoice('Discard Cargo', fbjsData, 'Discard cargo', 'Cancel'); 
     dialog.onconfirm = function() { 
     var goods = []; 
     var goodsIds = []; 
     numGoods = document.getElementById('goods-count').getValue(); 
     for(var i = 0; i < numGoods; i++) { 
      j = i + 1; 
      goods[i] = document.getElementById('goods-' + j).getValue(); 
      goodsIds[i] = document.getElementById('goods-id-' + j).getValue(); 
     } 
     var trainId = document.getElementById('train-id').getValue(); 
     param = { "goods": goods, "goods-id": goodsIds, "train-id": trainId }; 
     ajax.responseType = Ajax.JSON; 
     ajax.ondone = function(data) { 
      loadCargo(); 
     } 
     ajax.post(baseURL + '/turn/do-load-cargo-discard', param); 
     //dialog.hide(); 
     }; 
     dialog.oncancel = function() { 
     loadCargo(); 
     } 
    } 
    ajax.post(baseURL + '/turn/load-cargo-discard-dialog-fbjs', param); 
    } 
    ajax.post(baseURL + '/turn/load-cargo-select', param); 
/**/ 
} 

謝謝您可以提供任何幫助。

回答

1

您可以返回false;從discardExistingCargo函數中避免默認提交操作 - 這會導致頁面刷新。

0

問題解決了:按鈕的輸入類型爲「提交」,因此,頁面刷新(DOH!)