EVAL危险如何更换它

时间:2016-11-24 02:06:21

标签: javascript jquery eval

我有一个弹出窗口的代码(客户端请求)。它使用了我认为危险的eval。有没有办法重写下面的脚本,所以它不使用(eval)?

/* exported popup_default , popup_help , popup_sitemap , popup_footerlinks */

var matchClass = ['popup_default', 'popup_sitemap', 'popup_footerlinks', 'popup_help'];
var newwindow = ''

var popup_default = 'width=800,height=640,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=250,top=200';
var popup_help = 'width=700,height=650,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=100,top=100';
var popup_sitemap = 'width=1000,height=600,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=100,top=100';
var popup_footerlinks = 'width=800,height=500,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=250,top=200';

function pop_ups() {
  "use strict";
  var x = 0;
  var popClass;
  while (x < matchClass.length) {
    popClass = "'." + matchClass[x] + "'";
    $(eval(popClass)).click(function() {
      var popurl = $(this).attr('href');
      var popupSpecs = $(this).attr('class');
      var popupName = Math.floor(Math.random() * 10000001);
      newwindow = window.open(popurl, popupName, eval(popupSpecs));
      return false;
    });
    x++;
  }
}

$(function() {
  "use strict";
  pop_ups();
});

2 个答案:

答案 0 :(得分:4)

你想要使用

"use strict";
function makePopup(className, specs) {
    $('.'+className).click(function(e) {
        e.preventDefault();
        var popupName = Math.floor(Math.random()*10000001);
        window.open(this.href, popupName, specs);
    });
}
var popups = {
    popup_default:     'width=800,height=640,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=250,top=200',
    popup_help:        'width=700,height=650,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=100,top=100',
    popup_sitemap:    'width=1000,height=600,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=100,top=100',
    popup_footerlinks: 'width=800,height=500,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=250,top=200'
};
$(function() {
    for (var key in popups)
        makePopup(key, popups[key]);
});

而不是第一个eval,只需使用字符串连接。而不是第二个eval,使用一个对象来查找属性名称。

答案 1 :(得分:0)

谢谢@Bergi

我更新了脚本的最后一部分,因为它引发了一个错误:“for的主体应该包含在if语句中”

$(function() {
    "use strict";
    for (var key in popups) {
        if(popups.hasOwnProperty(key))
        {
           makePopup(key, popups[key]);
        }
    }
});

再次感谢您的帮助