2009-10-16 6 views
1

페이스 북을위한 게임을 개발 중입니다. 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!)