2016-09-18 51 views
1

我想在基於數據attr的jQuery中創建一個函數。使用jQuery數據屬性創建函數

<input type="text" name="name" id="name" data-validate="validatename" /> 

$("#name").blur(function(){ 
    var validate = $(this).attr("data-validate"); 
    var newvalidate = validate+"()"; 
    newvalidate; 
}); 

function validatename(){ 
    alert("success"); 
} 

調試提供了作爲validatename()newvalidate值,但功能不運行。我怎樣才能做這項工作?

+0

嘗試,'窗口[驗證]()',而不是引入'newValidate'。 –

+0

你在期待什麼'validate +「()」;'做,因爲我懷疑它是你在想什麼(*它只是一個字符串*)。 –

回答

3

這是因爲它不是一個功能,newvalidate只是與"validatename()"價值,僅此而已的字符串。要運行,你有名字作爲一個字符串,你可以做window[validate]()全局函數:

<input type="text" name="name" id="name" data-validate="validatename" /> 

$("#name").blur(function(){ 
    var validate = $(this).attr("data-validate"); 
    window[validate](); 
}); 

function validatename(){ 
    alert("success"); 
} 
5

創建一個以()結尾的字符串不會導致該函數被執行。要執行一個字符串,如果它的JavaScript代碼,你需要調用eval()

$("#name").blur(function(){ 
 
    var validate = $(this).attr("data-validate"); 
 
    var newvalidate = validate+"()"; 
 
    eval(newvalidate); 
 
}); 
 

 
function validatename(){ 
 
    alert("success"); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" name="name" id="name" data-validate="validatename" />

你也可以只查找名字在全球景觀得到函數本身並調用它。

window[validate]() 
+1

你不需要在這裏使用'eval()'。 –

+0

你不需要,但它是一種方法。 – Barmar

+0

是的,這是一種你可以做的方式,但使用受用戶輸入限制的'eval'永遠不是一個好主意。特別是在沒有必要時,可能會變慢。 –