Taking a shot in the dark...I know this is an old, unsupported version and control but I am so close to getting this huge application working in Google Chrome I just have to give it a shot. So right now the app works fine in IE but some nodes do NOT trigger a load event in Google Chrome; I dug into the JS files and I think I have a fix but no matter what I change, nothing changes. So I think this version uses the web resources and therefore the scripts are compiled in the DLLs right? So that is a dead end. BUT is there a way to disable the web resources or just point the app or the control to a script directory or a new ig_webtree.js file? I hope so.
Can anyone help?
Hi Peter,
You are right about it - scripts are compiled in the DLLs first, so you cant just replace the file.
However, you can benefit from Javascript prototype chain and override the methods that you need to. Let's say you need to rewrite the function doSomething from the ig_webtree.js file and put it in a myFix.js file:function myFix() { $IG.WebDataTree.prototype.__doSomething = function () { // your code }}
Then add your "patch" when the page loads, and call the function on body load event:
<head runat="server"> <script type="text/javascript" src="myFix.js"></script></head><body onload="myFix()">
When the problematic functions are about to be called, the functions from your file will be executed, instead of the code in the ig_webtree.js, which cannot be modified otherwise.
Please let me know if you have further questions on the matter, I will be glad to help.
Tried this but not working. I need to get this webtree control working in Chrome and I think it is because the get element function looks for igTxt but chrome is case sensitive and actually is igtxt so doesn’t find the element. I tried overriding that JS function but doesn’t work. Any help appreciated.
Nothing to apologize for.
I cannot tell for sure if it will need only one or two or more tweaks to get it working in Chrome. This control has been developed before Chrome was there, also support for it has expired.
This makes it really hard for me finding the code base available and running a sample against it. Anyway, as I said the suggested approach should be working.
Both are possible, but of course the easier solution is to place the fix in the aspx page that has the tree control.
Is this what you have tried, or you initially placed it in the parent html? If so, this explains the errors you were getting.
So lets say this is the tree.aspx file:
<!DOCTYPE html> <html> <head runat="server"> <script type="text/javascript" src="myFix.js</script> </head> <body onload="myFix()"> </body> </html>
And myFix.js contains the overriden function:
function myFix() { $IG.WebDataTree.prototype.__ig_getNodeTextElement = function () { if (node.element) { var i; for (i = 0; i < node.element.childNodes.length; i++) { var attrib = node.element.childNodes[i].getAttribute("igtxt"); if (attrib == "1") return node.element.childNodes[i]; } } return null; } }
Let me know if placing the file correctly in the aspx page helped.
Meanwhile, you can actually check at runtime if this will work. Just paste the code directly in the Chrome dev tools console. You can place debugger inside the overriden function to make it easier. Then, do the required interaction that is expected to call this code, and will see if execeution is stopped at the debugger.
Ok...ok...maybe some progress here...now I get
VM278 myFix.js:7 Uncaught ReferenceError: $IG is not defined at myFix (VM16 myFix.js:7) at onload (Menu.aspx:101)
OK, maybe the object on top of the prototype chain is not called $IG.WebDataTree. I suggest that you place the debugger in the original function to see which is the object on top of the chain. You can also send me the compiled js file, which contains the function.
ig_webtree.txt
Well, the file contains of functions that just float in the global namespace, so it makes it even easier - just write a function with the same name, and if it appears after the original (like suggested if loaded on body onload event). Content of myFix.js:
function ig_getNodeTextElement() { if (node.element) { var i; for (i = 0; i < node.element.childNodes.length; i++) { var attrib = node.element.childNodes[i].getAttribute("igtxt"); if (attrib == "1") return node.element.childNodes[i]; } } return null; }
I am glad that you managed to achieve your requirement.
Thank you for choosing Infragistics!
Yes...this seems to be working...awesome...thanks for your help.
Exactly, this sounds like the way to go. Do not hesitate to contact us at any time if any issue occurs or just to let us know if this worked in the end.
So instead of continuously fixing each function I may or may not discover not working, I went ahead and copied the entire file and tweaked all instances of the case sensitivity issue and am overwriting all the functions...so far this seems to be working...will continue testing. I can't thank you enough for your help.
Hi,
Check what is passed as node in the function arguments, check node.element.childNodes, compare it with a browser where this is working to see whats the difference. Keep us posted on the progress