小编Dan*_*rov的帖子

如何检测用户是否尝试在新标签中打开链接?

我正在编写一个网站,其中所有内容都存储在JavaScript环境中,因此应该可以在"页面"之间导航而无需额外的HTTP请求.

不过,我想保留用户关于链接打开方式的意图.例如,如果Mac用户apple +点击链接,则应在新选项卡中打开它.但是如果用户想要在当前窗口中打开一个链接,我想避免发出新的HTTP请求,只需使用DOM操作来显示新内容.

这是我试过的(JSFiddle):

<a href="http://yahoo.com" id="mylink">Yahoo!</a>
Run Code Online (Sandbox Code Playgroud)
document.getElementById("mylink").onclick = function() {
    alert("clicked");
    return false;
}
Run Code Online (Sandbox Code Playgroud)

它的行为与正常的左键单击和上下文菜单操作一样,但不适用于带有修饰键的单击.我可以检查某些修改键是否被保留,但这看起来很脆弱.

Twitter的网站具有类似于我想要的行为 - 当您点击用户名时,它通常是一个AJAX请求,但如果您点击持有的元键,则会获得一个新标签.

我更喜欢没有库的普通JavaScript解决方案,除非这需要一堆特定于平台的逻辑.

更新

我看了一下GitHub的代码,它也有我所追求的行为,它确实检查了某些密钥被保留.所以我接受克里斯的回答,因为似乎没有更好的选择.

$(document).on("click", ".js-directory-link", function (t) {
    return 2 === t.which || t.metaKey || t.ctrlKey ? void 0 : ($(this).closest("tr").addClass("is-loading"), $(document.body).addClass("disables-context-loader"))
}
Run Code Online (Sandbox Code Playgroud)

javascript

22
推荐指数
1
解决办法
2万
查看次数

为什么Scala的Addable已被弃用?

我注意到它Addable已被弃用,而Subtractable不是.有什么问题Addable,为什么Subtractable不同?

scala

18
推荐指数
2
解决办法
507
查看次数

来自UsbManager的NullPointerException

我有一些看起来像的代码

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
usbManager.getDeviceList();
Run Code Online (Sandbox Code Playgroud)

当我使用Android 5.0模拟器时,我遇到了这个崩溃:

java.lang.NullPointerException: Attempt to invoke interface method 'void android.hardware.usb.IUsbManager.getDeviceList(android.os.Bundle)' on a null object reference
    at android.hardware.usb.UsbManager.getDeviceList(UsbManager.java:243)
    ...
Run Code Online (Sandbox Code Playgroud)

我知道官方Android模拟器没有USB支持,但我希望看到一个空的USB设备列表,而不是崩溃.

我在Android代码中达到了顶峰,而且ServiceManager服务地图没有条目"usb".Android 21堆栈中的任何内容似乎都不会处理返回的null值ServiceManager.

该代码在模拟的4.4设备上运行良好,但在5.0设备上崩溃.CPU架构似乎没有什么区别; 我试过ARM和x86.

它也适用于我尝试的所有Genymotion设备,但我需要在CentOS CI主机上运行,​​并且让Genymotion在CentOS上运行似乎需要进行干扰性更改.

任何修复或解决方法的想法?作为最后的手段,我可​​以捕获UsbManagerNPE,但它会非常糟糕,因为我也使用与之交互的第三方库UsbManager.

usb android android-emulator

9
推荐指数
1
解决办法
1622
查看次数

Haskell数据类型到Java(OO)

我正在尝试将简单的Haskell数据类型和函数转换为OO.但我很困惑..

具有以下Haskell类型用于算术计算:

data Expr = Lit Int | 
      Add Expr Expr |
   deriving Show

--Turn the expr to a nice string
showExpr :: Expr -> String 
showExpr (Lit n) = show n
showExpr (Add e1 e2) = "(" ++ showExpr e1 ++ "+" ++ showExpr e2 ++ ")"
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试转换..

public interface Expr {
  String showExpr(String n);
} 

// Base case
public class Lit implements Expr {
  String n;

  public Lit(String n) {
    this.n = n;
  }

  @Override
  public String ShowExpr() …
Run Code Online (Sandbox Code Playgroud)

java haskell

7
推荐指数
1
解决办法
378
查看次数

在C++中重载[]以返回左值

我正在编写一个简单的哈希映射类:

template <class K, class V> class HashMap;
Run Code Online (Sandbox Code Playgroud)

实现是非常正统的:我有一个堆数组,当它变大时,它的大小翻倍.该数组包含键/值对的小向量.

Vector<Pair<K, V> > *buckets;
Run Code Online (Sandbox Code Playgroud)

我想以这样的方式重载下标运算符,这样的代码将起作用:

HashMap<int, int> m;
m[0] = 10; m[0] = 20;
m[2] = m[1] = m[0];
Run Code Online (Sandbox Code Playgroud)

特别是,

  • 对于m[k] = v其中m不包含k,我想添加一个新条目.
  • 对于m[k] = v其中m确实含有k,我想旧值被替换.
  • 在这两种情况下,我都希望返回作业v.

据推测,代码看起来像

V& operator[](K &key)
{
    if (contains(key))
    {
        // the easy case
        // return a reference to the associated value
    }
    else
    {
        Vector<Pair<K, V> > *buck = buckets + …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

5
推荐指数
3
解决办法
922
查看次数

Gradle的冲突解决方案不适用于Android项目?

我正在尝试编译其依赖树看起来像的模块

+--- com.squareup.burst:burst-junit4:1.0.2
|    +--- com.squareup.burst:burst:1.0.2
|    \--- junit:junit:4.11 -> 4.12
|         \--- org.hamcrest:hamcrest-core:1.3
+--- com.android.support.test.espresso:espresso-core:2.0
|    +--- com.squareup:javawriter:2.1.1
|    +--- org.hamcrest:hamcrest-integration:1.1
|    |    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
|    +--- org.hamcrest:hamcrest-library:1.1
|    |    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
|    +--- com.android.support.test.espresso:espresso-idling-resource:2.0
|    +--- com.android.support.test:testing-support-lib:0.1
|    |    \--- junit:junit-dep:4.10
|    |         \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
|    +--- com.google.code.findbugs:jsr305:2.0.1
|    +--- javax.annotation:javax.annotation-api:1.2
|    \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样存在hamcrest-core版本冲突,但gradle似乎认识到冲突并应用其默认的"最新版本"策略,这正是我想要的.

但是,在尝试运行时assembleDebugTest(手动或通过Android Studio),我得到了

com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/MatcherAssert;
Run Code Online (Sandbox Code Playgroud)

类似问题的一些答案暗示exclude …

android gradle android-gradle-plugin

5
推荐指数
1
解决办法
4847
查看次数