Hi Darin,
Thanks for your reply, I filed a bug report (http://
bugzilla.opendarwin.org/show_bug.cgi?id=7967) and included a test case.
I'm trying to track down an issue with the CPAN module
CGI::FormBuilder. It creates client side javascript validation code
that unfortunately does not work with Safari/Konqueror/OmniWeb, etc.
Thanks!
- marco
On Mar 27, 2006, at 12:02 PM, Darin Adler wrote:
On Mar 20, 2006, at 10:13 AM, Marco Wise wrote:
What kind of data structure/object is used internally by Safari /
Konqueror to store multiple inputs with the same name? Is it a
NodeList as in IE/Firefox, or something different? Can properties
be assigned to this object using Javascript?
Using the code below it looks like Firefox, IE and Safari create
an HTMLInputElement the first time a control named _submit is
encountered.
The second time a control named _submit is encountered, it seems
that a data structure is created to hold the HTMLInputElements and
these can then be accessed using array notation.
Firefox/IE report that this new structure is a Nodelist, but
Safari only reports that it's an "object". When I try using
toString() to get more information but then Safari reports an
error that it's not an object.
Finally,
In Firefox/IE you can assign new properties to this new Nodelist
as in _submit.foo = "bar" and you can retrieve their value.
In Safari (I'm using 2.0.3) doing so will fail silently and
retrieving them will return "undefined".
The code I'm using to try to sort this out:
<html>
<form name="test_form" onsubmit="test(this);">
<input type="submit" name="_submit" value="One">
<script>
alert("_submit is a " + document.forms[0]._submit);
alert("_submit's value is " + document.forms[0]._submit.value);
</script>
<input type="submit" name="_submit" value="Two">
<script>
alert("_submit is now a " + document.forms[0]._submit);
alert("_submit's value is now " + document.forms
[0]._submit.value);
alert("Assigning a value to _submit...");
document.forms[0]._submit.value = "New Value";
alert("_submit's value is now " + document.forms
[0]._submit.value);
alert("The original _submit's value can still be reached as an
item: " + document.forms[0]._submit[0].value);
</script>
</form>
</html>
I've looked at the webkit source code but I'm not an expert at C++
so I am not quite sure where to find this information. I've also
tried calling functions that should work on Nodelists and arrays
on this object and they fail. The only property that seems to work
is "length".
To recap, my question is: how does Safari store multiple input
controls that share the same name? Can this object have its own
properties (besides "length")?
Thanks in advance for any help you can provide,
Here are some implementation details. I don't know if they will
help you solve whatever problem you're working on.
document.forms is an HTMLCollection.
The function used to get an item by name in an HTML collection
exists only in the JavaScript binding in Safari. It's
JSHTMLCollection::getNamedItems, in kjs_html.cpp.
The class used when there is more than one item with the same name
is DOMNamedNodesCollection, defined in kjs_dom.h/cpp. Looking at
DOMNamedNodesCollection::getOwnPropertySlot, it looks like it
supports length, indexing by number, and indexing by ID.
Would you consider filing a bug report about the problem you're
encountering?
-- Darin
_______________________________________________
webkit-dev mailing list
[email protected]
http://www.opendarwin.org/mailman/listinfo/webkit-dev