为什么document.getElementById('hyperlink_element_id')返回超链接的href属性的值?

时间:2009-03-25 22:54:12

标签: asp.net javascript html dom

我正在尝试通过javascript获取Web.UI.WebControls.HyperLink对象,以便我可以修改它的ImageUrl。

这里我将超链接的NavigateUrl设置为我的javascript函数调用:

lnkShowHide.NavigateUrl = String.Format(
    "javascript:ShowHideElement('{0}');", lnkShowHide.ClientID
)

这是我的javascript函数:

function ShowHideElement(img) {
   var ele = document.getElementById(img);
   if(ele != null) {
      // Not sure if this will change the hyperlink's ImageUrl property???
      img.src = 'smallPlus.gif';
   }
}

但是,如果我在调用getElementById后检查'ele'的值,它会打印“String.Format("javascript:ShowHideElement.....”并且实际上并没有获得超链接对象。

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:5)

  

为什么document.getElementById()返回超链接的href属性的值?

没有。但是当你“警告(元素)”时,alert()调用元素上的toString(),HTMLLinkElement.toString()返回href属性的内容,因此“alert(link)”会发出与“alert”相同的结果(link.href)”。

(这有点奇怪和令人困惑,但这就是JavaScript 1.0的工作方式,因此现在没有太多可以解决的问题。)

  

我在调用getElementById之后检查'ele'的值它打印“String.Format(”javascript:ShowHideElement .....“

这不应该发生在您给出的确切示例中...服务器端“String.Format ...”代码无法通过客户端进行,除非您不小心将其封入引用,例如:

lnkShowHide.NavigateUrl = "String.Format(...)";

我想到的其他问题是函数更改了名称(ShowHideElement / ShowHideImage),并且您似乎试图在链接元素(< a>)上设置'.src'。链接没有.src,只有图像。

无论如何,你可能不想像这样做一个显示/隐藏小部件。 javascript:URL总是错误的,你的例子涉及很多嵌套的字符串,它们总是很脆弱。您可以尝试“不引人注目的脚本”方法,生成标记,如:

<div class="showhide"> blah blah blah </div>

使用JavaScript在客户端添加打开/关闭功能(因此非JavaScript UA和搜索引擎将看到整个页面而不隐藏位)。例如:

function ShowHider(element) {
    var img= document.createElement('img');
    element.parentNode.insertBefore(img, element);

    function toggle() {
        var show= element.style.display=='none';
        element.style.display= show? 'block' : 'none';
        img.src= '/images/showhide/'+(show? 'open' : 'closed')+'.gif';
        img.alt= show? '-' : '+';
        img.title= 'Click to '+(show? 'close' : 'open');
    }
    img.onclick= toggle;
    toggle();
}

// Apply ShowHider to all divs with className showhide
//
var divs= document.getElementsByTagName('div');
for (var i= divs.length; i-->0;)
    if (divs[i].className=='showhide')
        ShowHider(divs[i]);