Skip to main content

Client Triggers

Client triggers control when WSX sends requests to the server. They provide sophisticated event handling with timing controls, conditions, and advanced patterns.

Basic Trigger Events

Standard DOM Events

<!-- Click events -->
<button wx-send="click-action" wx-trigger="click">Click Me</button>

<!-- Input events -->
<input wx-send="input-action" wx-trigger="input" />

<!-- Form submission -->
<form wx-send="submit-action" wx-trigger="submit">
  <button type="submit">Submit</button>
</form>

<!-- Focus events -->
<input wx-send="focus-action" wx-trigger="focus" />
<input wx-send="blur-action" wx-trigger="blur" />

<!-- Change events -->
<select wx-send="change-action" wx-trigger="change">
  <option value="1">Option 1</option>
  <option value="2">Option 2</option>
</select>

Mouse Events

<!-- Mouse interactions -->
<div wx-send="hover-action" wx-trigger="mouseenter">Hover Me</div>
<div wx-send="leave-action" wx-trigger="mouseleave">Leave Me</div>
<div wx-send="move-action" wx-trigger="mousemove">Move Over Me</div>

<!-- Mouse buttons -->
<div wx-send="left-click" wx-trigger="click">Left Click</div>
<div wx-send="right-click" wx-trigger="contextmenu">Right Click</div>
<div wx-send="double-click" wx-trigger="dblclick">Double Click</div>

Keyboard Events

<!-- Key events -->
<input wx-send="key-action" wx-trigger="keyup" />
<input wx-send="key-action" wx-trigger="keydown" />
<input wx-send="key-action" wx-trigger="keypress" />

Timing Modifiers

Throttling

Limit the frequency of requests:
<!-- Throttle to maximum 1 request per 300ms -->
<input wx-send="search" wx-trigger="input throttle:300ms" />

<!-- Throttle with different intervals -->
<input wx-send="search" wx-trigger="input throttle:1s" />
<button wx-send="save" wx-trigger="click throttle:5s">Save</button>

Debouncing (Queue)

Delay requests until activity stops:
<!-- Wait 300ms after last event (default) -->
<input wx-send="search" wx-trigger="input queue" />

<!-- Custom debounce delay -->
<input wx-send="search" wx-trigger="input queue:500ms" />
<input wx-send="search" wx-trigger="input queue:1s" />

Delays

Add delays before sending requests:
<!-- 1 second delay after trigger -->
<button wx-send="delayed-action" wx-trigger="click delay:1s">Delayed</button>

<!-- 2 second delay -->
<input wx-send="delayed-search" wx-trigger="input delay:2s" />

Conditional Triggers

Key Conditions

Trigger only on specific keys:
<!-- Enter key only -->
<input wx-send="enter-search" wx-trigger="keyup[Enter]" />

<!-- Escape key -->
<input wx-send="cancel" wx-trigger="keyup[Escape]" />

<!-- Space key -->
<div wx-send="space-action" wx-trigger="keyup[Space]" />

<!-- Arrow keys -->
<div wx-send="up-action" wx-trigger="keyup[ArrowUp]" />
<div wx-send="down-action" wx-trigger="keyup[ArrowDown]" />

Modifier Keys

Trigger with modifier key combinations:
<!-- Ctrl key combinations -->
<input wx-send="ctrl-enter" wx-trigger="keyup[ctrlKey+Enter]" />
<input wx-send="ctrl-s" wx-trigger="keyup[ctrlKey+s]" />

<!-- Shift key combinations -->
<input wx-send="shift-enter" wx-trigger="keyup[shiftKey+Enter]" />

<!-- Alt key combinations -->
<input wx-send="alt-f" wx-trigger="keyup[altKey+f]" />

<!-- Meta key (Cmd on Mac, Windows key on PC) -->
<input wx-send="meta-k" wx-trigger="keyup[metaKey+k]" />

Value Conditions

Trigger based on element values:
<!-- Only when input has value -->
<input wx-send="search" wx-trigger="input[value]" />

<!-- Only when checkbox is checked -->
<input type="checkbox" wx-send="toggle" wx-trigger="change[checked]" />

<!-- Only when specific value -->
<select wx-send="premium-action" wx-trigger="change[value='premium']">
  <option value="basic">Basic</option>
  <option value="premium">Premium</option>
</select>

Change Detection

Only trigger when values actually change:
<!-- Only when value changes -->
<input wx-send="changed-search" wx-trigger="blur changed" />

<!-- Combine with other modifiers -->
<input wx-send="changed-search" wx-trigger="input changed throttle:300ms" />

Special Triggers

Once Modifier

Trigger only once:
<!-- Button can only be clicked once -->
<button wx-send="once-action" wx-trigger="click once">Click Once</button>

<!-- Input can only trigger once -->
<input wx-send="once-input" wx-trigger="input once" />

Intersection Observer

Trigger when element enters viewport:
<!-- Trigger when element becomes visible -->
<div wx-send="visible-action" wx-trigger="intersect">
  Trigger when visible
</div>

<!-- Trigger when element is 50% visible -->
<div wx-send="half-visible" wx-trigger="intersect:0.5">
  Trigger at 50% visibility
</div>

Scroll Events

Trigger on scroll positions:
<!-- Trigger when scrolled to bottom -->
<div wx-send="load-more" wx-trigger="scroll[bottom]">
  Load more content
</div>

<!-- Trigger when scrolled to top -->
<div wx-send="scroll-top" wx-trigger="scroll[top]">
  Scroll to top action
</div>

<!-- Trigger on any scroll -->
<div wx-send="scroll-action" wx-trigger="scroll">
  Scroll action
</div>

Advanced Patterns

Multiple Triggers

Combine multiple events:
<!-- Multiple trigger events -->
<button wx-send="multi-action" wx-trigger="click, dblclick">
  Click or Double Click
</button>

<!-- Different triggers for same element -->
<input 
  wx-send="search" 
  wx-trigger="input throttle:300ms"
  wx-send-enter="full-search"
  wx-trigger-enter="keyup[Enter]"
/>

Conditional Logic

Complex conditional triggers:
<!-- Multiple conditions -->
<input wx-send="complex-search" wx-trigger="input[value][length>2] throttle:500ms" />

<!-- Form validation trigger -->
<form wx-send="validate-form" wx-trigger="input[checkValidity()]">
  <input type="email" required />
  <button type="submit">Submit</button>
</form>

Custom Events

Listen for custom JavaScript events:
<!-- Custom event trigger -->
<div wx-send="custom-action" wx-trigger="my-custom-event">
  Custom Event Target
</div>

<script>
// Dispatch custom event
document.querySelector('[wx-trigger="my-custom-event"]')
  .dispatchEvent(new CustomEvent('my-custom-event', {
    detail: { customData: 'value' }
  }));
</script>

Real-World Examples

<input 
  type="text" 
  placeholder="Search products..."
  wx-send="search-products"
  wx-target="#search-results"
  wx-trigger="input throttle:300ms changed"
/>

Auto-Save Editor

<textarea 
  wx-send="auto-save"
  wx-target="#save-status"
  wx-trigger="input throttle:2s changed"
  placeholder="Start typing..."
></textarea>

Keyboard Shortcuts

<!-- Save shortcut -->
<div wx-send="save-document" wx-trigger="keyup[ctrlKey+s]">
  Press Ctrl+S to save
</div>

<!-- Search shortcut -->
<div wx-send="open-search" wx-trigger="keyup[ctrlKey+k]">
  Press Ctrl+K to search
</div>

Infinite Scroll

<div class="content-container">
  <div id="content">
    <!-- Content items -->
  </div>
  
  <div 
    wx-send="load-more"
    wx-target="#content"
    wx-trigger="intersect"
    wx-loading="Loading more..."
  >
    Loading trigger
  </div>
</div>

Form Validation

<form wx-send="validate-form" wx-target="#form-errors">
  <input 
    name="email" 
    type="email" 
    required
    wx-send="validate-email"
    wx-trigger="blur changed"
    wx-target="#email-error"
  />
  <span id="email-error"></span>
  
  <button type="submit">Submit</button>
</form>

Interactive Dashboard

<!-- Auto-refresh every 30 seconds -->
<div 
  wx-send="refresh-stats"
  wx-trigger="interval:30s"
  wx-target="#dashboard-stats"
>
  Auto-refreshing stats
</div>

<!-- Manual refresh -->
<button 
  wx-send="refresh-stats"
  wx-trigger="click"
  wx-target="#dashboard-stats"
>
  Refresh Now
</button>

Performance Considerations

Throttling vs Debouncing

<!-- Use throttling for real-time feedback -->
<input wx-send="live-search" wx-trigger="input throttle:200ms" />

<!-- Use debouncing for expensive operations -->
<input wx-send="expensive-search" wx-trigger="input queue:500ms" />

Event Delegation

<!-- Use event delegation for dynamic content -->
<div wx-send="item-action" wx-trigger="click" wx-target="closest .item">
  <!-- Dynamic items added here -->
</div>

Resource Management

<!-- Limit frequency of resource-intensive operations -->
<div wx-send="heavy-operation" wx-trigger="scroll throttle:1s">
  Heavy operation trigger
</div>

Error Handling

Trigger Validation

<form wx-send="submit-form" wx-validate="validateForm">
  <input name="email" type="email" required />
  <button type="submit">Submit</button>
</form>

<script>
function validateForm(form) {
  const email = form.querySelector('input[name="email"]');
  if (!email.checkValidity()) {
    alert('Please enter a valid email');
    return false;
  }
  return true;
}
</script>

Conditional Triggers

<!-- Only trigger if conditions are met -->
<button 
  wx-send="admin-action"
  wx-trigger="click"
  wx-if="user.isAdmin"
>
  Admin Only
</button>

Testing Triggers

Manual Testing

// Simulate trigger events
const element = document.querySelector('[wx-send="test-action"]');
element.dispatchEvent(new Event('click'));

// Test with custom data
element.dispatchEvent(new CustomEvent('click', {
  detail: { testData: 'value' }
}));

Automated Testing

// Test trigger behavior
describe('WSX Triggers', () => {
  test('should trigger on click', () => {
    const button = document.querySelector('[wx-trigger="click"]');
    const spy = jest.spyOn(wsx, 'send');
    
    button.click();
    
    expect(spy).toHaveBeenCalled();
  });
  
  test('should throttle input events', async () => {
    const input = document.querySelector('[wx-trigger="input throttle:300ms"]');
    const spy = jest.spyOn(wsx, 'send');
    
    // Simulate rapid input
    for (let i = 0; i < 5; i++) {
      input.dispatchEvent(new Event('input'));
    }
    
    // Should only trigger once due to throttling
    expect(spy).toHaveBeenCalledTimes(1);
  });
});

Best Practices

  1. Choose Appropriate Events: Use the right trigger for user interactions
  2. Throttle Heavy Operations: Use throttling for expensive server calls
  3. Debounce User Input: Use queue for final validation and search
  4. Provide Feedback: Show loading states for delayed actions
  5. Handle Edge Cases: Consider rapid clicks, network issues, etc.
  6. Accessibility: Ensure keyboard navigation works properly
  7. Performance: Monitor trigger frequency and optimize accordingly

Common Pitfalls

Over-Triggering

<!-- Avoid: Too frequent triggers -->
<input wx-send="search" wx-trigger="input" />

<!-- Better: Throttled triggers -->
<input wx-send="search" wx-trigger="input throttle:300ms" />

Missing Conditions

<!-- Avoid: Triggering on empty values -->
<input wx-send="search" wx-trigger="input" />

<!-- Better: Only trigger when there's content -->
<input wx-send="search" wx-trigger="input[value] throttle:300ms" />

Incorrect Timing

<!-- Avoid: Using wrong timing for use case -->
<input wx-send="search" wx-trigger="input delay:2s" />

<!-- Better: Use throttling for real-time feedback -->
<input wx-send="search" wx-trigger="input throttle:300ms" />

Next Steps