如何在ClojureScript中创建可以专注于窗口的js / Notification?

时间:2016-03-25 17:49:05

标签: clojure notifications focus clojurescript

我想用文本创建(chrome)通知,我可以点击发送通知的页面的通知。这是我得到的最接近的,并且注意到它非常非惯用。我不得不使用js*(js star),我找不到文档,但它只是执行一串javascript。

(js* "  var notification = new Notification('Here is the title', {
    icon: 'http://path.to/my/icon.png',
    body: 'Some body text',
  });

  notification.onclick = function () {
    console.log('hi there');
    this.close();
    window.focus();
  };")

请注意,log有效,close有效,但window.focus()没有。如果您将此代码的js部分复制并浏览到浏览器的控制台,则 可以正常工作。

我认为正确的答案看起来应该更像以下内容,但onclick对任何函数都不起作用:

(new js/Notification "Here is the title"
             (clj->js {:body "(click to vist page)"
                       :onclick #(.focus js/window)}))

编辑:如果您输入以下内容(例如,在图中),js/window肯定有一个focus参数。很明显,但我刚刚检查过,但是当用(.focus js/window)调用时它不起作用:

(.keys js/Object js/window)

这甚至无法集中注意力:

(js* "window.focus()")

我似乎无法找到js/Notification附加任何密钥以使onclick正常工作:

(.keys js/Object (new js/Notification "hi" (clj->js {:body "body text"})))

我一定是做错了什么,但是什么?

1 个答案:

答案 0 :(得分:2)

这是一个"直接端口"您原来的JavaScript代码:

(let [title "Here is the title"
      js-opts (js-obj "icon" "http://path.to/my/icon.png"
                      "body" "Some body text")
      js-notification (js/Notification. title js-opts)]
  (aset js-notification "onclick"
    (fn []
      (this-as js-this
        (.log js/console "hi there")
        (.close js-this)
        (.focus js/window)))))

注意我使用js-作为前缀的JavaScript引用,这是在ClojureScript中处理JavaScript互操作时的常见惯例。