如何防止将热键`添加到html表单输入中?

问题描述

我使用the instructions here从而将`变成了快捷方式:

function reset_shortcut_key(e) {
    if (e.keyCode == 192) reset_data();
}

document.addEventListener('keyup',reset_shortcut_key,false);

它成功加载了下一个问题,但是当我专注于<form> <input> </form>环境时按下此热键时,`字符会短暂出现(在加载下一个问题之前)。

A fill-in-the-gaps puzzle with a ` character showing.

我想阻止它显示`字符。

问题:如何防止将热键`添加到表单输入中?

其他相关问题是How can I prevent \ from being added from the form input?(但这是关于斜杠的删除)和Javascript -> Hotkeys -> Disable for input fields(和here)(但我希望热键可以正常工作)。


编辑:从当前的评论和答案来看,适当的功能event.preventDefault()。我仍然不清楚如何实际实现这一点。

仅在document.addEventListener('keyup',false);之前或之后添加它不会执行任何操作。除此之外,

        document.addEventListener("keyup",function(event) {
           event.preventDefault();
           reset_shortcut_key();
       },false);

        document.querySelector("#input-guess").addEventListener("keyup",false);

(其中id="input-guess"是我的<input>名称)都阻止了reset_shortcut_key()调用。如下修改reset_shortcut_key不会有任何改变:

        function reset_shortcut_key(e) {
            e.preventDefault();
            if(e.keyCode == 192) reset_data();
        }

在这一点上,我只是在猜测该怎么做。

解决方法

您尝试过吗? https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault

event.preventDefault();
,

原来,还有第二个问题:我需要使用internal(而不是InternalQuery())。进行更改后,以下代码(使用using System; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Reflection; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Query; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace IssueConsoleTemplate { #region Models public class User { public int Id { get; private set; } public virtual UserProfilePhoto UserProfilePhoto { get; set; } public static User Create(byte[] profilePhoto) { var user = new User { UserProfilePhoto = new UserProfilePhoto(profilePhoto) }; return user; } } public class UserProfilePhoto : INonRootQueryable { public int Id { get; set; } public byte[] ProfilePhoto { get; private set; } public UserProfilePhoto(byte[] profilePhoto) { ProfilePhoto = profilePhoto; } } #endregion #region Custom implementations public interface INonRootQueryable { } public class CustomQueryTranslationPreprocessorFactory : IQueryTranslationPreprocessorFactory { private readonly QueryTranslationPreprocessorDependencies _dependencies; private readonly RelationalQueryTranslationPreprocessorDependencies _relationalDependencies; public CustomQueryTranslationPreprocessorFactory( QueryTranslationPreprocessorDependencies dependencies,RelationalQueryTranslationPreprocessorDependencies relationalDependencies) { _dependencies = dependencies; _relationalDependencies = relationalDependencies; } public virtual QueryTranslationPreprocessor Create(QueryCompilationContext queryCompilationContext) => new CustomQueryTranslationPreprocessor( _dependencies,_relationalDependencies,queryCompilationContext); } public class CustomQueryTranslationPreprocessor : RelationalQueryTranslationPreprocessor { public CustomQueryTranslationPreprocessor( QueryTranslationPreprocessorDependencies dependencies,RelationalQueryTranslationPreprocessorDependencies relationalDependencies,QueryCompilationContext queryCompilationContext) : base(dependencies,relationalDependencies,queryCompilationContext) { } public override Expression Process(Expression query) { query = new ThrowOnNoneRootQueryableViolationExpressionVisitor().Visit(query); return base.Process(query); } } public class ThrowOnNoneRootQueryableViolationExpressionVisitor : ExpressionVisitor { private bool _isInternalQuery; protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.GetGenericMethodDefinition() == CustomQueryableExtensions.InternalQueryMethodInfo) { _isInternalQuery = true; return node.Arguments[0]; } return base.VisitMethodCall(node); } protected override Expression VisitConstant(ConstantExpression node) { var expression = base.VisitConstant(node); // Throws if SomeEntity in a DbSet<SomeEntity> implements INonRootQueryable and the query was not chained // to the `InternalQuery()` extension method. return !_isInternalQuery && node.Type.IsGenericType && node.Type.GetGenericTypeDefinition() == typeof(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable<>) && node.Type.GenericTypeArguments.Length == 1 && typeof(INonRootQueryable).IsAssignableFrom(node.Type.GenericTypeArguments[0]) ? throw new InvalidOperationException($"Directly querying for '{node.Type.Name}' is prohibited.") : expression; } } internal static class CustomQueryableExtensions { internal static readonly MethodInfo InternalQueryMethodInfo = typeof(CustomQueryableExtensions) .GetTypeInfo() .GetDeclaredMethods(nameof(InternalQuery)) .Single(m => m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType.Namespace == $"{nameof(System)}.{nameof(System.Linq)}" && m.GetParameters()[0].ParameterType.Name.StartsWith(nameof(IQueryable)) && m.GetParameters()[0].ParameterType.GenericTypeArguments.Length == 1); internal static IQueryable<TSource> InternalQuery<TSource>(this IQueryable<TSource> source) => source.Provider.CreateQuery<TSource>( Expression.Call( null,InternalQueryMethodInfo.MakeGenericMethod(typeof(TSource)),source.Expression)); internal static IQueryable<TProperty> InternalQuery<TEntity,TProperty>(this ReferenceEntry<TEntity,TProperty> source) where TEntity : class where TProperty : class => source.Query() .InternalQuery(); } #endregion public class ModelContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // Register the custom type IQueryTranslationPreprocessorFactory. // Since this is a console program,we need to create our own ServiceCollection // for this. // In an ASP.NET Core application,the AddSingleton call can just be added to // the general service configuration method. var serviceProvider = new ServiceCollection() .AddEntityFrameworkSqlServer() .AddSingleton<IQueryTranslationPreprocessorFactory,CustomQueryTranslationPreprocessorFactory>() .AddScoped( s => LoggerFactory.Create( b => b .AddConsole() .AddFilter(level => level >= LogLevel.Information))) .BuildServiceProvider(); optionsBuilder .UseInternalServiceProvider(serviceProvider) // <-- use our ServiceProvider .UseSqlServer(@"Data Source=.\MSSQL14;Integrated Security=SSPI;Initial Catalog=So63887500_05") .EnableSensitiveDataLogging() .EnableDetailedErrors(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); OnUserModelCreating(modelBuilder); } protected void OnUserModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>( entity => { entity.HasOne(e => e.UserProfilePhoto) .WithOne() .HasForeignKey<UserProfilePhoto>(e => e.Id); }); } } internal static class Program { private static void Main() { var accessingSetThrows = false; using (var ctx = new ModelContext()) { ctx.Database.EnsureDeleted(); ctx.Database.EnsureCreated(); var user = User.Create(new byte[] { }); ctx.Users.Add(user); ctx.SaveChanges(); } // Make sure,that UserProfilePhoto cannot be queried directly by default. using (var ctx = new ModelContext()) { try { ctx.Set<UserProfilePhoto>() .ToList(); } catch (InvalidOperationException) { accessingSetThrows = true; } Debug.Assert(accessingSetThrows); } // Make sure,that UserProfilePhoto can be queried directly,when using the `InternalQuery()` extension // method. using (var ctx = new ModelContext()) { var userProfilePhotos = ctx.Set<UserProfilePhoto>() .InternalQuery() .ToList(); Debug.Assert(userProfilePhotos.Count == 1); } // No eager loading of referenced types by default. using (var ctx = new ModelContext()) { var users = ctx.Users.ToList(); Debug.Assert(users.Count == 1); Debug.Assert(users[0].UserProfilePhoto == null); } // Eager loading of referenced types is allowed,when using the `InternalQuery()` extension method. using (var ctx = new ModelContext()) { var users = ctx.Users .Include(u => u.UserProfilePhoto) .InternalQuery() .ToList(); Debug.Assert(users.Count == 1); Debug.Assert(users[0].UserProfilePhoto != null); } // Explicitly load profile photo,when using the `InternalQuery()` extension method. using (var ctx = new ModelContext()) { var users = ctx.Users.ToList(); ctx.Entry(users[0]) .Reference(u => u.UserProfilePhoto) .InternalQuery() .Load(); Debug.Assert(users.Count == 1); Debug.Assert(users[0].UserProfilePhoto != null); } } } } )有效:

keydown