【问题标题】:How to add more parameters to addEventListener's functions? - Javascript如何为 addEventListener 的函数添加更多参数? - Javascript
【发布时间】:2017-07-23 16:21:47
【问题描述】:

我在使用 uploadDisplay_SP_reply_'.$statusid.' 时遇到问题 正如您所看到的,这些 div 具有唯一的 id ($statusid),它是自动递增的,因此如果我想在 Javascript addEventListener 的函数中的特定 div 内显示图像,程序将不知道应该在哪个 div 中显示图像。这是我的问题。在其他函数中,我可以添加这个唯一的 id,例如 PHP 中的 (replytext_'.$statusid.') 和 Javascript 中的 function showBtnDiv_reply(e),其中 e 是 $statusid,但在 function completeHandler_reply 中我不能。 function completeHandler_reply 仅从 addEventListener 中获取一个参数,即 event。那么如何将$statusid 添加到function completeHandler_reply 或者有什么办法可以解决?

PHP:

if($isFriend == true || $log_username == $u){
        $statuslist .= '<textarea id="replytext_'.$statusid.'" class="replytext" onfocus="showBtnDiv_reply('.$statusid.')" placeholder="Write a comment..."></textarea>';
        $statuslist .= '<div id="uploadDisplay_SP_reply_'.$statusid.'"></div>';
        $statuslist .= '<div id="btns_SP_reply_'.$statusid.'" class="hiddenStuff">';
            $statuslist .= '<button id="replyBtn_'.$statusid.'" class="btn_rply" onclick="replyToStatus('.$statusid.',\''.$u.'\',\'replytext_'.$statusid.'\',this)">Reply</button>';
            $statuslist .= '<img src="images/camera.png" id="triggerBtn_SP_reply" class="triggerBtn" onclick="triggerUpload_reply(event, \'fu_SP_reply\')" width="22" height="22" title="Upload A Photo" />';
        $statuslist .= '</div>';
        $statuslist .= '<div id="standardUpload_reply" class="hiddenStuff">';
            $statuslist .= '<form id="image_SP_reply" enctype="multipart/form-data" method="post">';
            $statuslist .= '<input type="file" name="FileUpload" id="fu_SP_reply" onchange="doUpload_reply(\'fu_SP_reply\','.$statusid.')"/>';
            $statuslist .= '</form>';
        $statuslist .= '</div>';    
        }
    }

Javascript:

我可以在这里添加$statusid作为参数e

function showBtnDiv_reply(e){
    _("replytext_"+e).style.height = "130px";
    _("btns_SP_reply_"+e).style.display = "block";
}

function doUpload_reply(id,sid){
    var file = _(id).files[0];
    if(file.name == ""){
        return false;       
    }

    if(file.type != "image/jpeg" && file.type != "image/gif" && file.type != "image/png" && file.type != "image/jpg"){
        alert("That file type is not supported.");
        return false;
    }
    _("triggerBtn_SP_reply").style.display = "none";
    _("uploadDisplay_SP_reply_"+sid).innerHTML = '<img src="images/rolling.gif" width="30" height="30">';
    var formdata = new FormData();
    formdata.append("stPic_reply", file);
    var ajax = new XMLHttpRequest();
    ajax.addEventListener("load", completeHandler_reply, false);
    ajax.addEventListener("error", errorHandler_reply, false);
    ajax.addEventListener("abort", abortHandler_reply, false);
    ajax.open("POST", "php_parsers/photo_system.php");
    ajax.send(formdata);    
}

但在这里我不能将$statusid 添加为event 旁边的第二个参数

function completeHandler_reply(event){
    var data = event.target.responseText;
    var datArray = data.split("|");
    if(datArray[0] == "upload_complete"){
        hasImage = datArray[1];
        _("uploadDisplay_SP_reply").innerHTML = '<img src="tempUploads/'+datArray[1]+'" class="statusImage" />';
    } else {
        _("uploadDisplay_SP_reply").innerHTML = datArray[0];
        _("triggerBtn_SP_reply").style.display = "block";
    }
}

function errorHandler_reply(event){
    _("uploadDisplay_SP_reply_").innerHTML = "Upload Failed";
    _("triggerBtn_SP_reply").style.display = "block";
}

function abortHandler_reply(event){
    _("uploadDisplay_SP_reply").innerHTML = "Upload Aborted";
    _("triggerBtn_SP_reply").style.display = "block";
}

我试过了,但对我没用。

function completeHandler_reply(event,sid){
    _("uploadDisplay_SP_reply_"+sid);
}

【问题讨论】:

    标签: javascript php parameters load addeventlistener


    【解决方案1】:

    您可以在 eventListener 中使用匿名函数,然后从该函数中调用实际函数。

    ajax.addEventListener("load", function(event){
        completeHandler_reply.call( this, arg1,arg2,arg3 );
    }, false );
    
    or 
    
    ajax.addEventListener("load", function(event){
        completeHandler_reply.apply( this, [ arg1, arg2, arg3 ] );
    }, false );
    

    传入任何合适的参数~我以arg1等为例

    【讨论】:

    • 这可行,但为什么我必须在我的 completeHandler_reply 函数之后添加 .call 或 .apply ?这些是做什么的?
    • 你不需要这样做 - 我总是倾向于这样做,但它既不在这里也不在那里。来自 MDN 的更多信息 ~ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 如果我使用 sid 而不是 arg1,我的 completeHandler_reply 函数如何知道什么是 sid?我的意思是,如果我们在上面的代码中查看我的一个函数,那么我们可以看到每个以 sid 或 e 作为参数的函数都以 PHP 形式调用,例如 doUpload_reply(\'fu_SP_reply\','.$statusid .') 和 doUpload_reply(id,sid) 下面的 Javascript 表单。我的函数会知道什么是 sid ($statusid) 和什么是 id(fu_reply)。但是,如果我只是在 completeHandler_reply 函数中将参数设置为 sid,那将给我一个错误。或者我可以使用 completeHandler_reply('.$statusid.') 吗?
    • 而且我没有在任何地方调用 completeHandler_reply。
    【解决方案2】:

    改用匿名函数怎么样?试试这个:

    ajax.addEventListener("load", function (event){
        _("uploadDisplay_SP_reply_"+sid);
    }, false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2017-09-05
      • 2022-07-12
      相关资源
      最近更新 更多