01/10/2018, 17:10
Hỏi về javascript tham số (i, origValue)
Em đang học jquery và thấy có đoạn code hơi khó hiểu 1 chút(em copy tren w3schools), vấn đề ở chỗ hai parametter là i, origValue lấy giá trị ở đâu ra để có kết quả như vậy ạ. vì trước khi truyền 2 tham số vào thì chưa thấy khởi tạo giá trị. bro nào thông não giùm em vs ạ.
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("button").click(function(){
$("#w3s").attr("href", function(i, origValue){
return origValue + "/jquery/";
});
});
});
</script>
</head>
<body>
<p><a href="https://www.w3schools.com" id="w3s">W3Schools.com</a></p>
<button>Change href Value</button>
<p>Mouse over the link (or click on it) to see that the value of the href attribute has changed.</p>
</body>
</html>
Link: https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_dom_attr_callback
Bài liên quan
origValue chính là giá trị hiện tại của “href” trong element có id “#w3s”
còn i là index
Dạ, cái này thì em hiểu. nhưng tham số truyền vào đó ở đâu ra hả anh, hay nó là mặc định như vậy. bởi vì nó chưa hề được khởi tạo giá trị thì làm sao nó có giá trị được ạ
vào đọc doc của jquery đi : http://api.jquery.com/attr/#attr-attributeName-function
em đọc rồi, mà anh không hiểu câu hỏi của em rồi.
Ý của em là cái function callback đấy nhập vào 2 tham số và return. nhưng em không hiểu là 2 tham số ấy được định nghĩa ở đâu. trong code không hề có khởi tạo giá trị cho nó
cái hàm này:
chính là hàm do bạn định nghĩa, tên tham số sử dụng trong hàm đó là do bạn tự đặt ra. hàm
attr
kia sẽ gọi đến hàm này của bạn và truyền vào các đối số vào.bạn có thể tìm hiểu thêm về callback nhé, cũng kiểu bạn sẽ định nghĩa hàm truyền vào cho function khác gọi đến.
Bạn trên dẫn link API chi tiết rồi mà bạn không hiểu, thì mình chuyển sang đọc source code cho tiện.
Hàm
toType(obj)
có thể xem là kết quả củatypeof obj
. Với obj là string thìtoType(obj)
trả về chuỗi “string”Hàm
isFunction()
kiểm tra 1 object có phải là function. Nghĩ đơn giản vậy là được rồi.Code sau khi đơn giản thế này, trích từ code gốc của jQuery. Mình loại mấy trường hợp tính toán và gọi hàm linh tinh thì rút gọn được vậy.
Trong
jQuery.fn.extend
có nhận object, object có property làattr
kiểufunction object
. Khi gọi$('#w3s').attr()
thì gọi tớifunction
củaattr
.this
là$('#w3s')
name
làhref
, kiểu stringvalue
làfunction () {...}
Trình tự như sau:
toType('href')
trả về “string”, block trong if không thực hiện.value
là function object,isFunction(value)
trả về true, block trong if không thực hiện.this
là kết quả sau khi thực thi$('w3s')
, kiểu array-like object, có propertylength
và các property có property descriptor Enumerable là true, dạng “0”, “1”, “2”Dùng
for
để lấy từng phần tử trong array-like objectthis
, gán vàoelem
.Kiểm tra
elem
có propertygetAttribute
hay không, nếu không sử dụng jQuery function prop thay thế. Giả sửelem
cógetAttribute
,typeof elem.getAttribute === 'undefined'
trả về false. Block trong if không thực hiện.Lấy giá trị attribute ‘href’ thông qua
getAttribute
, gán vào biếnoriginValue
.value
là function object, gọivalue()
với các tham sối
là index củafor
,originValue
là giá trị vừa lấy, giá trị trả về gán vàonewValue
(Trả lời câu hỏi ban đầu của thớt luôn,i
vàoriginValue
gọi ở đâu?)Gán giá trị mới
newValue
vào ‘href’ củaelem
.Thanks anh rất nhiều
Mãi mới có người support :)).
Tại em mới chuyển ngành chẳng có nền tảng mà nhảy qua học java-core, mãi mới sang được phần này, đến đoạn truyền tham số mà không thấy nó được khởi tạo nên hơi thắc mắc
@Ngoclong_Pham quan trọng là bạn phải để ý chỗ đấy là định nghĩa hàm chứ không phải là gọi hàm.
@hungsteve a có thể chỉ cho e cách xem source các hàm của jquery ở đâu được không ạ?
nhiều lúc e muốn xem nhưng k tìm thấy
Mình chỉ mò code của jQuery, rồi try hard thủ công thôi.
Bước đầu mở code của nó Download the uncompressed, development jQuery 3.3.1, nhấn Cmd + F (Ctrl + F) để tìm với từ khoá
attr
, mò mò mò, ra 2 hàmjQuery.attr
vàjQuery.fn.attr
. Sau đó debug thử, đặt breakpoint xem nó vôattr
nào? Sau đó lại áp dụng một cách thủ công các biến vào, rồi mò tiếpĐoạn code trên chỉ chạy được với name là string và value là function thôi, mình cũng mò tới đó. ngoài ra còn có nhiều trường hợp nữa:
value
kiểu primitive type, object thuần (không phải function),href
là DOM hay jQuery element. Mấy trường hợp khác mình chưa mò.à, ra là ở bản uncompressed.
e toàn down bản .min nên không mò được source của nó.
cảm ơn a nhé