I'm trying to figure out how to select the textarea in the code below using xpath and JavaScript (which is the only option here).
<body>
<div id="calculator">
<div id="calculatorController">
<form action="#" method="get" onsubmit="return false">
<p>
<textarea disabled="disabled"></textarea>
</p>
</form>
...
I'm trying to do something like this
var element = document.evaluate( '//body/form/p/textarea' ,document, null, XPathResult.ANY_TYPE, null );
// and write back
element.value = "Hello textarea";
But it fails
Anyone keen to help?
Thanks
Update below this
============================================================
The entire block of code looks like this.
Don't forget the window.onload=function()
<html>
<head>
<script type='text/javascript'>
//<![CDATA[
window.onload=function(){
var element = document.evaluate( '//body//form/p/textarea' ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;
if (element != null) {
element.value = 'Hello textarea';
}
}
//]]>
</script>
</head>
<body>
<div id="calculator">
<div id="calculatorController">
<form action="#" method="get" onsubmit="return false">
<p>
<textarea disabled="disabled"></textarea>
</p>
</form>
</div>
</div>
</body>
</html>
2 Answers 2
The evaluate method does not return a DOM node as you seem to expect. You would need
var element = document.evaluate( '//body//form/p/textarea' ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;
if (element != null) {
element.value = '...';
}
6 Comments
@Mark Robinson comment is right, your Xpath expression is wrong, you could use one of those :
//body/div/div/form/p/textarea (Mark's example)
//body//form/p/textarea (any form in body)
Plus, the evaluate function will return a XPathResult object, not the textarea, so you can't do directly element.value
Here is your example fixed:
<body>
<div id="calculator">
<div id="calculatorController">
<form action="#" method="get" onsubmit="return false">
<p>
<textarea disabled="disabled"></textarea>
</p>
</form>
</div>
</div>
</body>
--
var element = document.evaluate( '//body/div/div/form/p/textarea' ,document, null, XPathResult.ANY_TYPE, null );
var textarea = element.iterateNext ();
textarea.value = "Hello textarea";
window.onload = function_name;