我怎么能隐藏这个"这个"

时间:2016-12-13 19:09:57

标签: javascript



function $(selector) {

  var resultObject = {
    hide: function() {
      if (selector == this) {
        selector.style.visibility = "hidden";
      }

    }
  };

  return resultObject;
}

<input type="button" value="hide myself with my jquery " onclick="$(this).hide();" />
&#13;
&#13;
&#13;

如何检查选择器是否是&#34;这个&#34;所以我可以隐藏他..请考虑我必须重建hide函数,所以我不允许使用任何Jquery函数...

4 个答案:

答案 0 :(得分:9)

您根本不需要与this进行比较,因为您希望它能够传递给传递给$的任何内容。只需忽略if

function $(selector) {
    var resultObject = {
        hide: function () {
            selector.style.visibility = "hidden";
        }
    };
    return resultObject;
}
<input type="button" value="hide myself with my jquery " onclick="$(this).hide();" />

现在,如果您的selector参数可能不是DOM元素,而是CSS选择器,那么您需要测试其数据类型的参数。还要注意CSS选择器可以表示多个元素,所以如果你想要处理它,你还需要一个循环。

以下是如何实现此功能的示例:

function $(selector) {
    var nodes = typeof selector === "string" 
        ? Array.from(document.querySelectorAll(selector))
        : [selector];
    var resultObject = {
        hide: function () {
            nodes.forEach(function (node) {
                node.style.visibility = "hidden";
            });
        }
    };
    return resultObject;
}
<input type="button" value="hide all divs with my jquery " 
       onclick="$('div').hide();" />
<div>div 1</div>
<div>div 2</div>

下一个挑战是使这个可链接,你可以通过在 resultObject 中放入所有必要的状态并在每个方法上返回它来做到这一点:

function $(selector) {
    var resultObject = {
        nodes: typeof selector === "string" 
                ? Array.from(document.querySelectorAll(selector))
                : [selector],
        hide: function () {
            resultObject.nodes.forEach(function (node) {
                node.style.visibility = "hidden";
            });
            return resultObject;
        },
        text: function (txt) {
            resultObject.nodes.forEach(function (node) {
                node.textContent = txt;
            });
            return resultObject;
        },
        color: function (colorCode) {
            resultObject.nodes.forEach(function (node) {
                node.style.color = colorCode;
            });
            return resultObject;
        }
    };
    return resultObject;
}
<input type="button" value="color and put text in divs with my jquery " 
       onclick="$('div').color('red').text('clicked!');" />
<div>div 1</div>
<div>div 2</div>

这不是最佳选择,因为每次调用 $ 都会重新创建 resultObject 。所以你可以考虑改进它。然后应该有方法来过滤结果,找到所选节点下面的元素,等等。

但我们离题了。在你知道之前,你真的在​​写一个图书馆。 ; - )

答案 1 :(得分:4)

这里指的是窗口对象。

您可以使用call / apply

更改此范围

检查以下代码段

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {

     NSHTTPURLResponse * response = (NSHTTPURLResponse *)navigationResponse.response;

}
function $(selector) {


  var resultObject = {
    hide: function() {
      this.style.visibility = "hidden";
    }
  };

  return resultObject;
}

希望有所帮助

答案 2 :(得分:2)

看起来你已经过度复杂了。这可以通过简单地给你的按钮一个类来实现:

  <input type="button" value="hide myself with my jquery " class="hideme"/>

然后在JS中创建一个单击处理程序:

$('.hideme').click(function(){
    $(this).hide();
});

答案 3 :(得分:1)

OT,因为其他人已经指出,你似乎(过度)使事情变得复杂,对你的代码采用不同的方法:

onCreate()
// a utility ...
var style = (prop, value) => node => (node && node.style[prop] = value, node);
// ... in action ...
var hide = style("visibility", "hidden");