javascript onclick函数字符串的问题

时间:2010-04-13 21:28:11

标签: javascript

嘿所有,我一直在尝试这个问题几分钟,我似乎无法弄清楚如何纠正它。当它在函数中涉及多个varable时,我倾向于最难做这样的事情。

以下是代码:

  var tempString = "thePrompt('Are you sure you wish to delete this?', 'theDel('" + IDnum + "', '" + theTitle + "', \'" + temperDay + "\', \'" + temperMonth + "\', \'" + temperYear + "\', \'" + DDiff + "\')";

 html +=
"<div id='theTable" + IDnum + "' class='fc-event fc-event-hori fc-corner-left fc-corner-right' style='position:absolute; margin-top: 15px; z-index:8;left:"+left+"px'><div id='apDEL' style='position:relative;width:0px;height:0px;z-index:1000; top:-13px; left:2px; float:left;'><img src='img/xCal.png' width='15' height='15' alt='' border='0' onclick=\"" + tempString + "\" /></div>" + (ETC ETC...)

我不断得到的错误是:

 Error: missing ) after argument list
 Line: 1, Column: 68
 Source Code:
 thePrompt('Are you sure you wish to delete this posting?', 'theDel('105', '50 points for visiting us today!!!!', '13', '3', '2010', '2')

它指向'105'。

一如既往,任何帮助都会很精彩! :O)

大卫

修改/更新

好的,所以现在我已经移动了一些东西并让它工作(即将值发送到弹出提示框但是由于某种原因它在我点击删除按钮后看不到我的功能!这是因为提示位于主页面上,我正在使用的代码位于iframe内。

function theDel(theID, theTitle, day, month, year, DDiff)
{
    var tempString = "delClientE(" + theID + ", '" + theTitle + "', " + day + ", " + month + ", " + year + ", " + DDiff + ")";
    parent.thePrompt('Are you sure you wish to delete this event?', tempString);
}

删除按钮值现在如下所示:

delClientE(110, 'sadfsadfsdf', 14, 3, 2010, 2); jQuery.prompt.close();

然而,即使把parent.delClientE找不到这个函数......当提示框在那个之外时,如何从iframe中调用它?

大卫

7 个答案:

答案 0 :(得分:4)

跟踪嵌套上下文中的转义非常困难,因为当你弄错了,你经常给自己一个脚本注入安全问题时,最好不要通过将字符串粘在一起来创建HTML / JS。 / p>

相反,使用DOM方法从JavaScript分配事件处理程序,并告别所有令人恼火的反斜杠和引用内容:

var img= document.createElement('img');
img.src= 'img/xCal.png';
img.width=img.height= 15;
img.onclick= function() {
    if (confirm('Are you sure you wish to delete this?'))
        theDel(IDnum, theTitle, temperDay, temperMonth, temperYear, DDiff);
};
div.appendChild(img);

答案 1 :(得分:2)

这是因为这里引用'theDel('" +你应该逃避内部单引号。 编辑。当然,除了桌子上已经缺少的权利问题之外。 :)

答案 2 :(得分:1)

我认为在声明结尾处遗漏了......你的陈述如下:

var tempString = "thePrompt('question', theDel(params)";

..最后应该还有一个结束')'。

还有一件事你可能想看的是,theDel中的参数包含在单引号中。

thePrompt('Are you sure you wish to delete this?', 'theDel('105', '50 points for visiting us today!!!!', '13', '3', '2010', '2')' )

这可能是一个问题,因为提示中的参数也包含在单引号中,所以我会使thePrompt有双引号括起来它的params所以它看起来像这样:

var tempString = "thePrompt(\"Are you sure you wish to delete this?\", \"theDel(\'" + IDnum + "\', \'" + theTitle + "\', \'" + temperDay + "\', \'" + temperMonth + "\', \'" + temperYear + "\', \'" + DDiff + "\')\")";    

答案 3 :(得分:0)

大卫,不确定这是否已经让您满意,但为此创建一个临时变量可能更容易:

  var theDel = "theDel('" + IDnum + "', '" + theTitle + "', '" + temperDay + "', '" + temperMonth + "', '" + temperYear + "', '" + DDiff + "')";
  var tempString = "thePrompt('Are you sure you wish to delete this?', \' + theDel + \')";

答案 4 :(得分:0)

首先,使用event delegation with the js library of your choice可以更好。

如果不这样做,字符串插值功能可以使这些事情变得更容易:

String.prototype.format = function(values) {
  return this.replace(/\{(.+?)\}/g, function(s, key) {
    return values[key];
  });
}

这样长的事情变成了:

var s = 'blah blah blah "{IDnum}" blah blah blah \'{foosball}\''.format({ IDnum: '1', foosball: 'xyz'});

(如果您不喜欢操纵String的原型,可以将该功能放在其他地方。)

答案 5 :(得分:0)

好的,这个怎么样?

iFrame来源

<html>
<head>
<script type="text/javascript">
    function localDel(params){
        if (window.parent && typeof window.parent.thePrompt==='function')
            window.parent.thePrompt('Are you sure you wish to delete this event?', params);
    }
</script>
</head>
<body>
    <p onclick="localDel([1,'some title', 14, 3, 2010, 2])">delete</p>
    <p onclick="localDel([2,'another title', 14, 3, 2010, 2])">delete</p>
</body>
</html>

家长来源

<html>
<head>
    <script type="text/javascript">

    function thePrompt(msg,params) {
        if(confirm(msg)) theDel.apply(this,params);
    }

    function theDel(id, title, tDay, tMonth, tYear, dDiff) {
      alert(id);
      // etc...
    }

    </script>
</head>
<body>
    <iframe src="iframe.html" />
</body>
</html>

答案 6 :(得分:0)

我终于明白了!!好极了! :O)

 function theDel(theID, theTitle, day, month, year, DDiff)
{
    var tempString = "window.frames.theCal.delClientE(" + theID + ", '" + theTitle + "', " + day + ", " + month + ", " + year + ", " + DDiff + ")";
    parent.thePrompt('Are you sure you wish to delete this event?', tempString);
}

我需要window.frames.theCal才能调用我的函数。 theCal是我的iframe ID。

大卫