2013-12-13 91 views
-1

當我單擊按鈕以將bbcode插入到textarea時控制檯警報:「未捕獲的ReferenceError:未定義myTextarea」。你能幫我解決這個問題嗎?jQuery中未捕獲的引用錯誤

我有一個代碼:未定義

$(function(){ 
function formatText(el,tagstart,tagend){ 
var selectedText=document.selection?document.selection.createRange().text:el.value.substring(el.selectionStart,el.selectionEnd);// IE:Moz 
var newText='['+tagstart+']'+selectedText+'[/'+tagend+']'; 
if(document.selection){//IE 
el.focus(); 
var st=getCaret(el)+tagstart.length+2; 
document.selection.createRange().text=newText; 
var range=el.createTextRange(); 
range.collapse(true); 
range.moveStart('character', st); 
range.moveEnd('character',selectedText.length); 
range.select(); 
el.focus(); 
} 
else{//Moz 
var st=el.selectionStart+tagstart.length+2; 
var end=el.selectionEnd+tagstart.length+2; 


el.value=el.value.substring(0,el.selectionStart)+newText+el.value.substring(el.selectionEnd,el.value.length); 
    el.focus(); 
    el.setSelectionRange(st,end) 
    } 
    } 
function getCaret(el) { // IE mission is tricky :) 
    el.focus(); 
    var r = document.selection.createRange(); 
    if (r == null) { 
     return 0; 
    } 
    var re = el.createTextRange(), 
    rc = re.duplicate(); 
    re.moveToBookmark(r.getBookmark()); 
    rc.setEndPoint('EndToStart', re); 

    var add_newlines = 0; 
    for (var i=0; i<rc.text.length; i++) { 
     if (rc.text.substr(i, 2) == '\r\n') { 
     add_newlines += 2; 
     i++; 
     } 
    } 
return rc.text.length + add_newlines; 
} 
$("elements").after('<form action="/post" method="post" name="myForm"><textarea placeholder="Comments..." name="myTextarea"></textarea><span class = "repbbcode" title = "Bold" value="b" style="font-weight:bold" >B</span></form>'); 
$(".repbbcode").on("click" , function(){ 
formatText(myTextarea,'b','b'); 
}); 
}); 
+0

「myTextarea沒有定義」 猜這就是問題所在。看起來你錯過了它。 – epascarello

+0

我已經在textarea的name =「myTextarea」中加入了它 – lovelyangle

+0

是的,這是一個元素的名稱,而不是一個JS變量。 – epascarello

回答

1
$(".repbbcode").on("click" , function(){ 
    formatText(myTextarea,'b','b'); 
       ^^^^^^^^^^ 
}); 

myTextarea。沒有

var myTextarea = .... 

在您的代碼中。你需要像

$(".repbbcode").on("click" , function(){ 
    var myTextarea = $("[name='myTextarea']).get(0); 
    formatText(myTextarea,'b','b'); 
}); 
+0

謝謝。它起作用^。^。但我想我已經在var textareaElement = document.getElementsByName(「myTextArea」)[0]中找到了解決方案; – lovelyangle

+1

這與我的jQuery解決方案是一樣的。大聲笑你使用jQuery,所以你爲什麼不使用jQuery來選擇元素。 ;) – epascarello

0

在這行代碼:

formatText(myTextarea,'b','b'); 

你要通過作爲第一個參數DOM元素。你不能只傳遞一個DOM元素的名字。使用document.getElementById("myTextArea")最簡單,然後在元素中設置id="myTextArea"

因此,您的textarea HTML將是<textarea id="myTextArea" ...>

而且,你的代碼將是:

var textareaElement = document.getElementById("myTextArea"); 
formatText(textareaElement,'b','b'); 

如果你想通過名稱的DOM元素,你也可以這樣做:

var textareaElement = document.getElementsByName("myTextArea")[0]; 
formatText(textareaElement,'b','b'); 

什麼不同,這裏是document.getElementsByName()返回潛在多個元素的列表,因此您必須使用[0]進入該列表才能讓列表中的第一項傳遞給您的函數。


有很多不同的方法來做到這一點(使用名稱,類,ID等...)。通常,如果您試圖在頁面中獲取一個唯一元素,您可以給它一個id並使用document.getElementById()或jQuery等效項。

+0

謝謝。這工作。 :「var textareaElement = document.getElementsByName(」myTextArea「)[0];」 – lovelyangle

0

您需要添加var myTextarea = document.getElementsByName('myTextarea')[0];

$(".repbbcode").on("click" , function(){ 
     var myTextarea = document.getElementsByName('myTextarea')[0]; // added myTextarea 
     formatText(myTextarea,'b','b'); 
}); 
+0

感謝我的問題解決^。^ – lovelyangle