如何传递JSON Object的选项参数来打开一个新窗口?

a1o7rhls  于 12个月前  发布在  其他
关注(0)|答案(8)|浏览(162)

window.open()对象有一些奇怪的参数列表.
是否有办法执行类似window.open({options..})的操作;
想法呢?

iugsix8n

iugsix8n1#

可以将options作为URL参数传递:

window.open( myURL + "/?options=" + JSON.stringify(options) );

字符串

ecr0jaav

ecr0jaav2#

这种语言没有内置的功能。
但是,自己写一个是相当容易的。
举例来说:

function popup(url, name, options) {
    if (arguments.length === 2) {
        options = name;
        name = options.name;
    }

    var features = false;

    for (var key in options) {
        if (!options.hasOwnProperty(key)) continue;
        if (key === "name") continue;

        if(features)
            features += ",";

        features += key + "=";

        if (!options[key])
            features += "no";
        else if (options[key] === true)
            features += "yes";
        else
            features += options[key];
    }
    return window.open(url, name, features);
}

字符串

fzsnzjdm

fzsnzjdm3#

以及

function newWindow(options) {
  var opts = [], keys = ['height', 'width', 'scrollable', /* all those options */];
  for (var i = 0; i < keys.length; ++i) {
    if (keys[i] in options)
      opts.push(keys[i] + '=' + options[keys[i]]);
  }
  return window.open(options.url, options.name, opts.join(','));
}

字符串

hiz5n14c

hiz5n14c4#

不,那是一个用JavaScript调用的dom函数。
在任何情况下,“选项对象”策略实际上只在JSON概念中得到了如此大的使用,DOM规范早于JSON。
你可以构建一个带有参数字段的JS对象,如果你想要一个窗口打开器助手,可以覆盖toString()。

luaexgnf

luaexgnf5#

不,但你可以很容易地编写自己的 Package 。

gab6jxml

gab6jxml6#

我不这么认为,因为功能是一个逗号分隔的窗口功能列表
从**MDC**

var WindowObjectReference = window.open(strUrl, 
                                        strWindowName  
                                        [, strWindowFeatures]);

字符串
不过,没有什么可以阻止您编写一个接受对象并使用适当参数调用window.open()的 Package 器

slwdgvem

slwdgvem7#

你可以创建自己的函数来解析JSON对象,并根据解析结果使用特定的参数调用window.open()函数?

bnl4lu3b

bnl4lu3b8#

显然这是不存在的。最简单的解决方案是将其从json转换为参数使用的格式。这里有一个简单的方法,通过使用一些全局正则表达式在一行中完成:

JSON.stringify(properties).replace(/true/g, "yes").replace(/false/g, "no").replace(/:/g, '=').replace(/}|{|"/g, '');

字符串
这适用于几乎所有的浏览器,我也在Internet Explorer 11中测试过。
一个更现代的方法是使用replaceAll:

JSON.stringify(properties).replaceAll("true", "yes").replaceAll("false", "no").replaceAll(':', '=').replaceAll(/}|{|"/g, '');


此方法的浏览器支持较少,但它给出了相同的结果。

相关问题