【问题标题】:Javascript window.open pass values using POSTJavascript window.open 使用 POST 传递值
【发布时间】:2011-08-06 18:12:33
【问题描述】:

我有一个 javascript 函数,它使用 window.open 调用另一个页面并返回结果。

这是我的代码部分:

var windowFeatures = "status=0, toolbar=0, location=0, menubar=0, directories=0, resizable=1, scrollbars=1";
window.open ('http://www.example.com/index.php?p=view.map&coords=' + encodeURIComponent(coords), 'JobWindow', windowFeatures);

我现在的问题是我传递的数据太多,GET 无法处理,我需要使用 POST 方法传递它。

如何转换上面的代码以使用 POST 方法打开页面而不在整个页面上实现表单(页面列出了 100 个订单和供应商列表 - 我正在尝试映射供应商)

【问题讨论】:

    标签: javascript post get window


    【解决方案1】:

    我使用了上述方法的变体,但我没有打印 html,而是构建了一个表单并将其提交到 3rd 方 url:

        var mapForm = document.createElement("form");
        mapForm.target = "Map";
        mapForm.method = "POST"; // or "post" if appropriate
        mapForm.action = "http://www.url.com/map.php";
    
        var mapInput = document.createElement("input");
        mapInput.type = "text";
        mapInput.name = "addrs";
        mapInput.value = data;
        mapForm.appendChild(mapInput);
    
        document.body.appendChild(mapForm);
    
        map = window.open("", "Map", "status=0,title=0,height=600,width=800,scrollbars=1");
    
    if (map) {
        mapForm.submit();
    } else {
        alert('You must allow popups for this map to work.');
    }
    

    【讨论】:

    • 我认为 document.body.appendChild(mapForm); 在这里是多余的,可以安全地省略,以免 DOM 混乱。
    • @Fedor 删除该行将导致 firefox 上出现空白弹出窗口
    • @Mancy 谢谢你的评论,没想到火狐
    • 如果您不担心您的数据 | window.open('xxx_url.php?xxx_var='+xxx_var+'&xxx2_var='+xxx2_var, '_blank');
    • @rut 作为 GET 和 POST 命令发送数据是有区别的。问题是关于使用 POST 命令发送数据。
    【解决方案2】:

    谢谢php-b-grader。我改进了代码,不需要使用window.open()target已经在form中指定了。

    // Create a form
    var mapForm = document.createElement("form");
    mapForm.target = "_blank";    
    mapForm.method = "POST";
    mapForm.action = "abmCatalogs.ftl";
    
    // Create an input
    var mapInput = document.createElement("input");
    mapInput.type = "text";
    mapInput.name = "variable";
    mapInput.value = "lalalalala";
    
    // Add the input to the form
    mapForm.appendChild(mapInput);
    
    // Add the form to dom
    document.body.appendChild(mapForm);
    
    // Just submit
    mapForm.submit();
    

    对于目标选项 --> w3schools - Target

    【讨论】:

    • OP 有大量的 windowFeatures 可以传递给弹出窗口。您的解决方案无法做到这一点。只有基于 window.open() 的解决方案才能优雅地做到这一点
    【解决方案3】:

    感谢 php-b-grader !

    在 window.open 的通用函数下方使用 POST 传递值:

    function windowOpenInPost(actionUrl,windowName, windowFeatures, keyParams, valueParams) 
    {
        var mapForm = document.createElement("form");
        var milliseconds = new Date().getTime();
        windowName = windowName+milliseconds;
        mapForm.target = windowName;
        mapForm.method = "POST";
        mapForm.action = actionUrl;
        if (keyParams && valueParams && (keyParams.length == valueParams.length)){
            for (var i = 0; i < keyParams.length; i++){
            var mapInput = document.createElement("input");
                mapInput.type = "hidden";
                mapInput.name = keyParams[i];
                mapInput.value = valueParams[i];
                mapForm.appendChild(mapInput);
    
            }
            document.body.appendChild(mapForm);
        }
    
    
        map = window.open('', windowName, windowFeatures);
    if (map) {
        mapForm.submit();
    } else {
        alert('You must allow popups for this map to work.');
    }}
    

    【讨论】:

      【解决方案4】:

      代码帮助我满足了我的要求。

      我做了一些修改,并使用了我完成的表格。这是我的代码-

      需要'form'的'target'属性——就是这样!

      表格

      <form id="view_form" name="view_form" method="post" action="view_report.php"  target="Map" >
        <input type="text" value="<?php echo $sale->myvalue1; ?>" name="my_value1"/>
        <input type="text" value="<?php echo $sale->myvalue2; ?>" name="my_value2"/>
        <input type="button" id="download" name="download" value="View report" onclick="view_my_report();"   /> 
      </form>
      

      JavaScript

      function view_my_report() {     
         var mapForm = document.getElementById("view_form");
         map=window.open("","Map","status=0,title=0,height=600,width=800,scrollbars=1");
      
         if (map) {
            mapForm.submit();
         } else {
            alert('You must allow popups for this map to work.');
         }
      }
      

      完整的代码解释了显示普通表单和表单元素。

      【讨论】:

        【解决方案5】:

        尽管这个问题是很久以前的问题,但感谢所有帮助我解决类似问题的意见。 我还根据此处其他人的答案进行了一些修改,并将多个输入/值变成了单个对象(json);并希望这对某人有所帮助。

        js:

        //example: params={id:'123',name:'foo'};
        
        mapInput.name = "data";
        mapInput.value = JSON.stringify(params); 
        

        php:

        $data=json_decode($_POST['data']); 
        
        echo $data->id;
        echo $data->name;
        

        【讨论】:

          【解决方案6】:

          不管怎样,这里是之前提供的封装在一个函数中的代码。

          openWindowWithPost("http://www.example.com/index.php", {
              p: "view.map",
              coords: encodeURIComponent(coords)
          });
          

          函数定义:

          function openWindowWithPost(url, data) {
              var form = document.createElement("form");
              form.target = "_blank";
              form.method = "POST";
              form.action = url;
              form.style.display = "none";
          
              for (var key in data) {
                  var input = document.createElement("input");
                  input.type = "hidden";
                  input.name = key;
                  input.value = data[key];
                  form.appendChild(input);
              }
          
              document.body.appendChild(form);
              form.submit();
              document.body.removeChild(form);
          }
          

          【讨论】:

          • 恕我直言,这是最好的答案。请注意,它负责在发送后删除表单,清理 DOM。它也被编写为即用型函数。干得好
          • document.body.removeChild(form);对我来说,这条线确保输入字段被隐藏
          • 这个问题是你不能像 window.open() 那样传递 windowFeatures
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-17
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多