我如何解析一个脚本标签,并得到一个变量在它里面,而不使用eval()

How can I parse a script tag, and get a variable inside of it, without using eval()?

本文关键字:一个 eval 脚本 何解析 标签 变量      更新时间:2023-09-26

我有一个生成此代码的页面MULTIPLE times (字段数组的内容不同):

<script language="javascript">
try {
  var fields = Array();
  fields = {id:1,type:text,value:banana};
  fields = {id:2,type:text,value:apple};
  fields = {id:3,type:number,value:10};
}
</script>

然后我有一个访问字段数组的函数:

function functionName(fieldId){
  var allFields = eval('fields');
  if (allFields) {
    for ( var i = 0; i < allFields.length; i++) {
        var field = allFields[i];
        if(field.id == fieldId){
          return field;
        }
    }
  }
  return null;
}

问题是,我想在多个地方使用这个函数,访问不同脚本标签的字段数组。现在,该函数总是只获取第一个脚本标记,我需要能够将其范围限定为特定的脚本标记。

由于我不能更改生成数组的实际函数,因此我可以更改脚本标记的ID,如下所示:

    <script language="javascript" id="uniqueID">
    try {
      var fields = Array();
      .....
    }
    </script>

现在我把函数改成这样:

var script = document.getElementById(uniqueID);
    function functionName(fieldId){
      var allFields = eval('fields'); // now here...how do I scope this by using the script var that I've created above?
....
    }

那么,我怎么能范围我的allFields var到一个特定的脚本标签?

这很粗糙,但是您可以使用正则表达式来解析script块,假设它总是以相同的格式生成它。

function functionName(scriptID, fieldID) {
    var lines = $('#' + scriptID).text().split(''n')
    var result;
    $.each(lines, function(i, e) {
        var match = e.match(/field = ('{.*'})/);
        if (match) {
            var obj = eval(match[1]);
            if (obj.id == fieldID) {
                result = obj;
                return false; // Tell `$.each` to stop
            }
        }
    }
    return result;
}