2012-07-30 136 views
1

我使用codemirror和jquery在浏览器中“模拟”一个xml编辑器。一些xml-Tags包含一个“on”属性,其中包含两个可能的值(true或false)。是否可以在onclick事件中切换这些值?是否可以使用codemirror/jquery插件?JS属性值onclick替换

编辑:

自编码的解决方案。

function attrtoggle(){ 
    var pos = editor.getCursor(); 
    var line = editor.getLine(pos.line); 
    var index = line.indexOf("on="); 

    if(index > 0){ 
     //define range 
     if (pos.ch -3 < index || pos.ch - 9 > index) 
      return false; 

     var len = 10; 
     var replace_pos = index + 4; 

     if(line.charAt(replace_pos) == "t"){ 
      //insert false 
      line = line.replace('true', 'false'); 
     } else{ 
      //insert true 
      line = line.replace('false', 'true'); 
     } 
     edited = pos.line; 
     editor.setLine(pos.line, line); 
    } 
} 

只需添加一个事件处理程序onclick事件

$(".CodeMirror").attr("onclick","javascript:attrtoggle()"); 
+0

只是为了澄清:你在CodeMirror编辑XML和对XML喜欢'',你想,当用户点击文本编辑器节点上,有它改成''? – JoshMock 2012-07-30 17:39:15

+0

是的!哪种方式最好? – NaN 2012-07-30 20:25:46

回答

0

到目前为止还不完善(糟糕的设计等),但它按预期工作:

只是触发功能在onclick事件。

function attributeToggle(){ 

    var transitions = { 
     "on": { 
      "false":"true", 
      "true":"false" 
     } 
    } 


    var pos = editor.getCursor(); // object {line, ch} 
    var token = editor.getTokenAt(pos); 
    var line = editor.getLine(pos.line); 

    try{ 

     var prev_pos = token.start - 1; 
     var prev_token = editor.getTokenAt({'line':pos.line, 'ch':prev_pos}); 

     if(prev_token.className == "attribute") 
      var attr = prev_token.string; 
     else 
      return false; 

     if(typeof transitions[attr] === "undefined") //nothing to replace 
      return false; 

     var current_val = token.string.toLowerCase().replace(/(['"])/g, ""); 


     if(typeof transitions[attr][current_val] === "undefined") 
      return false; 

     var line_new = line.substring(0, token.start) + \ 
"\"" + transitions[attr][current_val] + "\"" + line.substring(token.end); 

     editor.setLine(pos.line, line_new); 


    } catch (e){ 
     console.log(e); 
    } 
}