8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

输入类型日期,区分为空和无效

ggutenberg 2月前

184 0

我有一个模态窗口,其表单包含一个日期类型的可选字段,即:如果我选择一个日期,例如 2024 年 5 月 14 日,然后删除一些

我有一个模态窗口,其表单包含一个 日期 ,即:

<input id="myDate" type="date" />

如果我选择一个日期,即 2024 年 5 月 14 日,然后删除一些部分(使日期不完整),即 dd/05/2024 ,似乎空白或不完整的日期或错误的格式以相同的方式处理,就好像日期为空一样。(使用 jQuery 的 .val() 两种情况下的值都为空)

有没有办法使用 jQuery 将空日期与不完整或格式错误的情况区别对待?

帖子版权声明 1、本帖标题:输入类型日期,区分为空和无效
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由ggutenberg在本站《validation》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 是的,这是可能的,如果 val 为空,您可以检查 validity.badInput 输入是否完全为空或者有输入但它的“错误输入”,例如 dd/05/2024

    $('#submit').on('click', function(){
      $input = $('#date');
      if ($input.val() == ""){
        if ($input[0].validity.badInput) {
          console.log("INPUT NOT EMPTY BUT INVALID!!!")
        }
        else {
          console.log("INPUT COMPLETELY EMPTY")
        }
      }
      else {
        console.log("INPUT VALID: " + $input.val() ) 
      }
     });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    
    
    <input type="date" id="date">
    <input type="submit" id="submit">
  • 以下代码的输出与我想象的并不一样。看来对 testAA.require() 返回的字符串数组所做的更改并没有反映在关联数组中。我

    以下代码的输出行为与我想象的不一样。看来对 testAA.require() 并没有反映在关联数组中。我以为动态数组是通过引用传递的,但这似乎与这个概念相反。将数组重新分配给 testAA 似乎有效,但不起作用的原因让我很困惑。任何提示或想法都将不胜感激!

    module main;
    
    import std.stdio;
    
    void main()
    {
      string[][string] testAA;
      string[] vals = ["InitVal1", "InitVal2"];
    
      auto list = testAA.require("Key", vals);
    
      writeln("list: ", list);
    
      list ~= "Val1";
      list ~= "Val2";
    
      writeln("list: ", list);
      writeln("testAA", testAA);
    }
    

    输出结果如下:

    list: ["InitVal1", "InitVal2"]
    list: ["InitVal1", "InitVal2", "Val1", "Val2"]
    testAA["Key":["InitVal1", "InitVal2"]]
    
  • 在 之后不需要 update 调用 require ,只需执行 testAA["Key"] ~= "Val1" 。请注意,这不会更新 list ,它仍然是添加时数组切片的副本。

    如果您想通过引用来执行此操作,则需要使用指针:

    auto list = &testAA.require("Key", vals); // keep a pointer to the array
    *list ~= "Val1";
    *list ~= "Val2";
    

    如果我不确定 AA 是否有密钥,我通常会这样做 aa.require(key) ~= val; 。这比直接建立索引稍微差一点,但基本上相当于建立索引, value.init 在尚不存在时放入一个。

  • 太棒了!没想到直接在关联数组上使用 ~= 运算符。更重要的是,即使尚未设置键,只需执行 \'testAA[\'Key\'] ~= \'Val1\';' 即可。这一切是如何发生的对我来说仍然有点神秘,但这仍然相当优雅。谢谢!

  • 有人向我指出了使用关联数组 update() 方法,并解释说切片(动态数组)由一个指针和一个长度组成,即使引用了内容本身,它们也会被复制。因此,当切片在关联数组外部更新时,关联数组中的切片不会更新。

    因此我使用它来创建一个包含单个项目的新列表,或者如果列表已存在则将值附加到列表中:

    testAA.update("Key", () => ["Val1"], (ref string[] x) {x ~= "Val1";});
    
  • 文档中哪里提到关联数组是通过 ref 传递的?如果您需要 ref,则函数的函数签名中应包含 ref 关键字。这与普通数组相同。

  • 就目前的情况来看,您的答案不够清晰。请编辑以添加更多详细信息,帮助其他人了解此内容如何解决所提问题。您可以在帮助中心找到有关如何撰写良好答案的更多信息。

  • \'通过引用传递\' 就像指针一样,而不是关键字 \'ref\'。数据类型要么通过值传递(被复制),要么通过引用传递(指针)。关联数组确实通过引用传递给函数。动态数组(切片)则不然。例如,此函数确实为关联数组参数分配了一个新值:void setmap(int[string] map, string key, int val) { map[key] = val; } 而此函数不会将值附加到数组,因为它是通过值传递的:void arrayAppend(int[] arr, int val) { arr ~= val; }

  • @Finger - dlang.org/spec/hash-map.html#construction_and_ref_semantic

  • 我尝试编写一个如下所示的测试:private static readonly IEnumerable ListOfEnumValues = Enum.GetValues(typeof(MyEnumType)).Cast ();私有静态重新...

    我尝试编写如下测试:

    private static readonly IEnumerable<MyEnumType> ListOfEnumValues = Enum.GetValues(typeof(MyEnumType)).Cast<DocumentType>();
    private static readonly IEnumerable<bool> ListOfBoolValues = new List<bool>(){true, false};
    
        
    [Theory]
    [TestData(ListOfEnumValues, ListOfBooleanValues)]
    public void Test(EnumType type, bool myBool)
    {
      // test code
    };
    

    这怎么可能?

  • 我有一个正在运行的微服务程序,我想在不修改代码的情况下拦截它向下游服务发送的所有请求,并返回给定的数据,以便更好地测试它。有没有

    我有一个正在运行的微服务程序,我想在不修改代码的情况下拦截它发送给下游服务的所有请求,并返回给定的数据以便更好地测试它。

    有没有相应的工具可以做到这一点?

  • 我正在为使用 express-session 包的 NestJS/Express 服务器编写单元测试。它有一个对象,其中包含可能并不总是定义的方法。在我的代码中,我首先检查它是否存在...

    我正在为使用该包的 NestJS/Express 服务器编写单元测试 express-session 。它有一个对象,其中包含可能并不总是定义的方法。在我的代码中,我首先检查它是否存在,如下所示:

    clearAllSessions(): Promise<string> {
      return new Promise<string>((resolve, reject) => {
       if (this.sessionStore.clear != null) {
          this.sessionStore.clear();
          resolve(`The sessions have been cleared!`);
        } else {
          reject(new Error(`Unable to clear sessions!`));
        }
      });
    }
    

    我正在编写这样的测试 (它使用辅助方法来获取错误,与此无关)

    it('should throw an error when session clear is not available to be called', async () => {
      jest.spyOn(sessionStore, 'clear').mockImplementation(undefined)
    
      const result = await getError(() => adminSvc.clearAllSessions());
    
      expect(sessionStore.clear).not.toHaveBeenCalled();
      expect(result).toEqual(new Error(`Unable to clear sessions!`));
    });
    

    问题是它将 this.sessionStore.clear 返回一个 jest mock 函数,而不是 undefined 像我的代码会检查的那样简单,所以测试会采用第一个代码分支,这不是我想要的。我如何模拟实现为空?

  • 这是一个可能的解决方案:

    public static IEnumerable<object[]> ListOfValues =>
        from EnumType et in Enum.GetValues(typeof(EnumType))
        from bool myBool in new[] { true, false }
        select new object[] { et, myBool };
    
    
    [Xunit.Theory]
    [MemberData(nameof(ListOfValues))]
    public void Test(EnumType type, bool myBool)
    {
        // test code
    };
    

    这将为所有可能的组合生成测试。

    如果 enum 有 3 个值,并且我们 bool 在示例中有一个,这将生成 6 (3 x 2) 个测试

  • 仅用于 Object.defineProperty() 修改对象的现有属性。

    const sessionStore: { clear?: () => void } = {
      clear() {
        console.log('real implementation');
      },
    };
    
    describe('78741514', () => {
      test('should pass', () => {
        const restore = sessionStore.clear;
        Object.defineProperty(sessionStore, 'clear', { value: undefined });
        expect(sessionStore.clear).toBeUndefined();
        sessionStore.clear = restore;
      });
    });
    
  • 您可以利用 yield return

    public static IEnumerable<object[]> ListOfValues()
    {
         foreach (var et in Enum.GetValues(typeof(EnumType)))
         {
            yield return new [] { et, true };
            yield return new [] { et, false };
         }
    }
    

    我认为这种方法可能比多源 linq 查询表达式更容易理解。

  • 谢谢,这似乎可行。这比简单地设置 sessionStore.clear = undefined; 更好吗?

  • 我必须编写 zod express 验证器中间件,该中间件对 zod-express-middleware 进行了稍微修改这是我的自定义请求验证器导出类型 ErrorListItem = {类型:'Query' |'Params'|...

    我必须编写 zod express 验证器中间件,该中间件对 zod-express-middleware

    这是我的自定义请求验证器

    export type ErrorListItem = {
      type: 'Query' | 'Params' | 'Body' | 'Response';
      errors: ZodError<any>;
    };
    
    type RequestSchemas<TParams, TQuery, TBody, TResponse> = Partial<{
      params: ZodSchema<TParams>;
      query: ZodSchema<TQuery>;
      body: ZodSchema<TBody>;
      response: ZodSchema<TResponse>;
    }>;
    
    type RequestCallback<TParams, TQuery, TBody, TResponse> = (
      data: {
        params: TParams;
        body: TBody;
        query: TQuery;
      },
      req: Express.Request,
      res: Express.Response
    ) => Promise<TResponse>;
    
    type ValidatedRequest = (
      req: Express.Request,
      res: Express.Response,
      next: Express.NextFunction
    ) => Promise<void>;
    
    export const doValidatedRequest =
      <TParams, TQuery, TBody, TResponse>(
        schemas: RequestSchemas<TParams, TQuery, TBody, TResponse>,
        cb: RequestCallback<TParams, TQuery, TBody, TResponse>,
        succesStatusCode: number = 200
      ): ValidatedRequest =>
      async (req, res, next) => {
        try {
          const errors: ErrorListItem[] = [];
    
          const requestData = {
            params: {} as any,
            body: {} as any,
            query: {} as any
          };
    
          if (schemas.params) {
            const parsedParams = schemas.params.safeParse(req.params);
            if (parsedParams.success) {
              requestData.params = parsedParams.data;
            } else {
              errors.push({ type: 'Params', errors: parsedParams.error });
            }
          }
    
          if (schemas.body) {
            const parsedBody = schemas.body.safeParse(req.body);
            if (parsedBody.success) {
              requestData.body = parsedBody.data;
            } else {
              errors.push({ type: 'Body', errors: parsedBody.error });
            }
          }
    
          if (schemas.query) {
            const parsedQuery = schemas.query.safeParse(req.query);
            if (parsedQuery.success) {
              requestData.query = parsedQuery.data;
            } else {
              errors.push({ type: 'Query', errors: parsedQuery.error });
            }
          }
    
          if (errors.length) {
            next(errors);
          }
    
          const response = await cb(requestData, req, res);
          if (schemas.response) {
            const parsedResponse = schemas.response.safeParse(response);
            if (parsedResponse.success) {
              res.status(succesStatusCode).json(parsedResponse.data);
            } else {
              errors.push({ type: 'Response', errors: parsedResponse.error });
            }
          } else {
            // Response not specified and thus not expected
            res.status(succesStatusCode).json(response);
          }
        } catch (error) {
          next(error);
        }
      };
    

    现在当我尝试使用它

    router.get('/', doValidatedRequest({}, async ({}, req, res) => someFunction(req, res));
    

    或者

    router.get('/:id', doValidatedRequest({
      query: z.object({
        id: z.string()
      }),
    }, async ({ query: { id }}) => someFunction(id));
    

    我经常收到 eslint 错误 Promise returned in function argument where a void return was expected. eslint(@typescript-eslint/no-misused-promises)

    我如何定义 someFunction

    const someFunction = async (): Promise<void> => { // do something }
    const someFunction = async (): Promise<string> => { return "OK" }
    const someFunction = async (id: string): Promise<string> => { return id }
    const someFunction = (): void => { // do something }
    const someFunction = (): string => { return "OK" }
    const someFunction = (id: string): string => { return id }
    

    有人能发现这是为什么吗?我似乎找不到原因,我也想知道这是否还会在某个时候引起其他问题。我该如何改进这个中间件?

    这个想法是,这可以用来验证请求参数和响应,如果需要,将经过验证且类型正确的参数传递给控制器​​函数,然后将可选验证的响应传递给验证器,然后将响应发送回请求者。

  • 我的定义似乎有两个问题,都可以在这个代码片段中看到

    type ValidatedRequest = (
      req: Express.Request,
      res: Express.Response,
      next: Express.NextFunction
    ) => Promise<void>;
    
    export const doValidatedRequest =
      <TParams, TQuery, TBody, TResponse>(
        schemas: RequestSchemas<TParams, TQuery, TBody, TResponse>,
        cb: RequestCallback<TParams, TQuery, TBody, TResponse>,
        succesStatusCode: number = 200
      ): ValidatedRequest =>
      async (req, res, next) => {
    

    第一个是,我输入了返回类型为, ValidatedRequest 并且 Promise<void> 当它是 TS 的返回类型时, doValidatedRequest 会看到返回了一个 Promise<void> 。整个 ValidatedRequest 类型可能有点多余,而的返回类型可以 doValidatedRequest 只是 express.RequestHandler .

    其次,我定义了 ValidatedRequest (or RequestHandler ) 函数, async (req, res, next) => ... 它还告诉 TS 有某种承诺需要返回。

    第三,我想我有一些奇怪的 eslint 规则告诉我不应该在 express 中间件中使用承诺。不确定 express 是否可以处理这些。我想可以。

    无论如何,现在的解决办法是重新定义 doValidatedRequest

    export const doValidatedRequest =
      <TParams, TQuery, TBody, TResponse>(
        schemas: RequestSchemas<TParams, TQuery, TBody, TResponse>,
        cb: RequestCallback<TParams, TQuery, TBody, TResponse>,
        succesStatusCode = 200
      ): RequestHandler =>
      (req, res, next) => {
        const errors: ErrorListItem[] = [];
    
        const requestData = {
          params: {} as any,
          body: {} as any,
          query: {} as any
        };
    
        if (schemas.params) {
          const parsedParams = schemas.params.safeParse(req.params);
          if (parsedParams.success) {
            requestData.params = parsedParams.data;
          } else {
            errors.push({ type: 'Params', errors: parsedParams.error });
          }
        }
    
        if (schemas.body) {
          const parsedBody = schemas.body.safeParse(req.body);
          if (parsedBody.success) {
            requestData.body = parsedBody.data;
          } else {
            errors.push({ type: 'Body', errors: parsedBody.error });
          }
        }
    
        if (schemas.query) {
          const parsedQuery = schemas.query.safeParse(req.query);
          if (parsedQuery.success) {
            requestData.query = parsedQuery.data;
          } else {
            errors.push({ type: 'Query', errors: parsedQuery.error });
          }
        }
    
        if (errors.length) {
          next(errors);
        }
    
        cb(requestData, req, res)
          .then(response => {
            if (schemas.response) {
              const parsedResponse = schemas.response.safeParse(response);
              if (parsedResponse.success) {
                res.status(succesStatusCode).json(parsedResponse.data);
              } else {
                errors.push({ type: 'Response', errors: parsedResponse.error });
              }
            } else {
              // Response not specified and thus not expected
              res.status(succesStatusCode).json(response);
            }
          })
          .catch(next);
      };
    

    这应该和原来的一样好用,并且没有显示任何类型的 TS/eslint 错误

  • jkp 2月前 0 只看Ta
    引用 20

    在构建 C++ 程序时,我收到错误消息“未定义对‘vtable 的引用...”此问题的原因是什么?我该如何修复它?我恰好收到以下错误:

    在构建 C++ 程序时,我收到错误消息

    对“vtable…”未定义引用

    导致此问题的原因是什么?我该如何修复它?


    碰巧的是,我遇到了以下代码的错误(有问题的类是 CGameModule。)我无论如何也想不明白问题出在哪里。起初,我认为这与忘记给虚拟函数提供主体有关,但据我所知,一切都在这里。继承链有点长,但这是相关的源代码。我不确定我还应该提供什么其他信息。

    注意:看起来,这个错误是在构造函数中发生。

    我的代码:

    游戏模块

    class CGameModule : public Dasher::CDasherComponent {
     public:
      CGameModule() : CDasherModule() {};
      virtual ~CGameModule();
    
      virtual void HandleEvent(Dasher::CEvent *pEvent);
    };
    

    游戏模块.cpp

    #include "cgamemodule.h"
    
    void CGameModule::HandleEvent(Dasher::CEvent *pEvent) {}
    

    继承自....

    namespace Dasher {
      class CEvent;
      class CDasherComponent;
    };
    
    class Dasher::CDasherComponent {
     public:
      CDasherComponent() {};
      virtual ~CDasherComponent() {};
    
      virtual void HandleEvent(Dasher::CEvent * pEvent) {};
    };
    
返回
作者最近主题: