如何传递选项参数的 JSON 对象来打开新窗口?

问题描述 投票:0回答:8

window.open() 对象有一些时髦的参数列表...

有没有办法做类似 window.open({options..}); 的事情

想法?

javascript json window.open
8个回答
3
投票

您可以将

options
作为 URL 参数传递:

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

2
投票

该语言没有内置这样的功能。

但是,自己编写一个相当容易。
例如:

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);
}

2
投票

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(','));
}

1
投票

不。这是一个用 javascript 调用的 dom 函数。

无论如何,“选项对象”策略实际上只是在 JSON 概念中得到了如此广泛的应用,而 DOM 规范早在一段时间内就出现了。

如果你想要一个开窗器助手,你可以构建一个带有参数字段的 JS 对象并重写 toString() 。


1
投票

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


1
投票

我不这么认为,因为这些功能是逗号分隔的窗口功能列表

来自MDC

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

没有什么可以阻止你编写一个包装器,尽管它接受一个对象,然后使用适当的参数调用

window.open()


1
投票

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


0
投票

显然这不存在。 最简单的解决方案是将其从 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, '');

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

© www.soinside.com 2019 - 2024. All rights reserved.