我正在编写一个网站,其中所有内容都存储在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) 我注意到它Addable已被弃用,而Subtractable不是.有什么问题Addable,为什么Subtractable不同?
我有一些看起来像的代码
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.
我正在尝试将简单的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) 我正在编写一个简单的哈希映射类:
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) 我正在尝试编译其依赖树看起来像的模块
+--- 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 …